本文共 4080 字,大约阅读时间需要 13 分钟。
小菜前段时间根据超多 star 的 自己修改封装了仿网易顶部滑动标题栏 滑动内容可以是文字也可以是网络图标,并整理了两篇小博客:
因小菜自己封装的 TabSlideLayout 在滑动过程中没有回弹的动画效果,而 默认的滑动过程中也没有动画效果,而小菜技术太渣,所以只能照葫芦画瓢,按照 FlycoTabLayout 中的 CommonTabLayout 样式,二次优化一下自己的 TabSlideLayout。
小菜修改封装的 TabSlideLayout 是一个不限制栏目个数,超过屏幕范围可滑动切换的顶部 Tab 布局,item 的内容可以是文字也可以是图片,并且支持对文字和图片对绘色。
小菜测试步骤如下:
mIndicatorAnimEnable = ta.getBoolean(R.styleable.SlidingTabLayout_tl_indicator_anim_enable, true);mIndicatorBounceEnable = ta.getBoolean(R.styleable.SlidingTabLayout_tl_indicator_bounce_enable, true);mIndicatorAnimDuration = ta.getInt(R.styleable.SlidingTabLayout_tl_indicator_anim_duration, -1);public void setIndicatorAnimDuration(long indicatorAnimDuration) { this.mIndicatorAnimDuration = indicatorAnimDuration;}public void setIndicatorAnimEnable(boolean indicatorAnimEnable) { this.mIndicatorAnimEnable = indicatorAnimEnable;}public void setIndicatorBounceEnable(boolean indicatorBounceEnable) { this.mIndicatorBounceEnable = indicatorBounceEnable;}public long getIndicatorAnimDuration() { return mIndicatorAnimDuration;}public boolean isIndicatorAnimEnable() { return mIndicatorAnimEnable;}public boolean isIndicatorBounceEnable() { return mIndicatorBounceEnable;}
@Overridepublic void onAnimationUpdate(ValueAnimator animation) { View currentTabView = mTabsContainer.getChildAt(this.mCurrentTab); IndicatorPoint p = (IndicatorPoint) animation.getAnimatedValue(); mIndicatorRect.left = (int) p.left; mIndicatorRect.right = (int) p.right; if (mIndicatorWidth < 0) { //indicatorWidth小于0时,原jpardogo's PagerSlidingTabStrip } else {//indicatorWidth大于0时,圆角矩形以及三角形 float indicatorLeft = p.left + (currentTabView.getWidth() - mIndicatorWidth) / 2; mIndicatorRect.left = (int) indicatorLeft; mIndicatorRect.right = (int) (mIndicatorRect.left + mIndicatorWidth); } invalidate();}
private boolean mIsFirstDraw = true;//draw indicator lineif (mIndicatorAnimEnable) { if (mIsFirstDraw) { mIsFirstDraw = false; calcIndicatorRect(); }} else { calcIndicatorRect();}
public void setCurrentTab(int currentTab, boolean smoothScroll) { mLastTab = this.mCurrentTab; this.mCurrentTab = currentTab; updateTabSelection(currentTab); if (mFragmentChangeManager != null) { mFragmentChangeManager.setFragments(currentTab); } if (mIndicatorAnimEnable) { calcOffset(); } else { invalidate(); }}
@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { /** * position:当前View的位置 * mCurrentPositionOffset:当前View的偏移量比例.[0,1) */ scrollToCurrentTab(); invalidate();}
Tips: 若 ViewPager 的 onPageSelected 调用步骤四方法后,在 item 点击时可去掉步骤四方法的调用,否则点击时,会回弹两次,效果不佳。
// 方案一:new Handler().postDelayed(new Runnable(){ public void run() { scrollTo(tempX, 0); }}, mIndicatorBounceEnable ? 600 : 250);// 方案二:if (tab_title != null) { new Handler().postDelayed(new Runnable(){ public void run() { tab_title.setTextColor(isSelect ? mTextSelectColor : mTextUnselectColor); if (mTextBold == TEXT_BOLD_WHEN_SELECT) { tab_title.getPaint().setFakeBoldText(isSelect); } } }, mIndicatorBounceEnable ? 400 : 250);}
小菜再一次体会到,优化与封装是一个耗时、用心的漫长过程,需要不断的测试和尝试。小菜现在的解决方案也并非最佳效果,不合理的地方还请各位多多指教。
下面是小菜的公众号,欢迎闲来吐槽哦~
转载地址:http://mzbql.baihongyu.com/