前言
需求1
需求2
ColorTrackTabLayout
源码
使用
//隐藏Indicator mTab.setSelectedTabIndicatorHeight(0); //设置左右内边距 mTab.setTabPaddingLeftAndRight(10,10); mTab.setupWithViewPager(mViewPager);
原理
private void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh, boolean implicitSetup) { .... if (viewPager != null) { mViewPager = viewPager; // Add our custom OnPageChangeListener to the ViewPager if (mPageChangeListener == null) { //添加了滑动监听 mPageChangeListener = new TabLayoutOnPageChangeListener(this); } mPageChangeListener.reset(); viewPager.addOnPageChangeListener(mPageChangeListener); // Now we'll add a tab selected listener to set ViewPager's current item mCurrentVpSelectedListener = new ViewPagerOnTabSelectedListener(viewPager); addOnTabSelectedListener(mCurrentVpSelectedListener); final PagerAdapter adapter = viewPager.getAdapter(); if (adapter != null) { // Now we'll populate ourselves from the pager adapter, adding an observer if // autoRefresh is enabled setPagerAdapter(adapter, autoRefresh); } // Add a listener so that we're notified of any adapter changes if (mAdapterChangeListener == null) { mAdapterChangeListener = new AdapterChangeListener(); } mAdapterChangeListener.setAutoRefresh(autoRefresh); viewPager.addOnAdapterChangeListener(mAdapterChangeListener); // Now update the scroll position to match the ViewPager's current item setScrollPosition(viewPager.getCurrentItem(), 0f, true); } else { // We've been given a null ViewPager so we need to clear out the internal state, // listeners and observers mViewPager = null; setPagerAdapter(null, false); } .... }
@Override public void setupWithViewPager(@Nullable ViewPager viewPager, boolean autoRefresh) { super.setupWithViewPager(viewPager, autoRefresh); try { //通过反射找到mPageChangeListener Field field = TabLayout.class.getDeclaredField("mPageChangeListener"); field.setAccessible(true); TabLayoutOnPageChangeListener listener = (TabLayoutOnPageChangeListener) field.get(this); if (listener != null) { //删除自带监听 viewPager.removeOnPageChangeListener(listener); mPageChangeListenter = new ColorTrackTabLayoutOnPageChangeListener(this); mPageChangeListenter.reset(); viewPager.addOnPageChangeListener(mPageChangeListenter); } } catch (Exception e) { e.printStackTrace(); } }
@Override public void addTab(@NonNull Tab tab, int position, boolean setSelected) { ColorTrackView colorTrackView = new ColorTrackView(getContext()); colorTrackView.setProgress(setSelected ? 1 : 0); colorTrackView.setText(tab.getText() + ""); colorTrackView.setTextSize(mTabTextSize); colorTrackView.setTag(position); colorTrackView.setTextChangeColor(mTabSelectedTextColor); colorTrackView.setTextOriginColor(mTabTextColor); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); colorTrackView.setLayoutParams(layoutParams); tab.setCustomView(colorTrackView); super.addTab(tab, position, setSelected); if (position == 0) { //默认选中第一个 setSelectedView(position); } setTabWidth(position, colorTrackView); }
最后
鸣谢
作者:Wey Ye