【记录】记录点滴
场景:修改TabLayout的指示器长度
需求:未使用自定义Tab样式的情况下,指示器长度为文字内容长度
1. 方法基本有1)反射修改,局限性较大;2)修改TabLayout文件,根据自身的需求实现指示器
2. 为了保证灵活性和较好的用户体验,修改了TabLayout文件修改指示器长度
追踪源码,知道SlidingTabStrip负责展示Tab及对应的指示器。
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// Thick colored underline below the current selection
if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) {
canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,
mIndicatorRight, getHeight(), mSelectedIndicatorPaint);
}
}
SlidingTabStrip在绘制完主要内容后,会继续绘制圆角矩形作为指示器。修改mIndicatorLeft及mIndicatorRight就可以改变指示器的长度,setIndicatorPosition()方法会修改它们的值并触发绘制。
void setIndicatorPosition(int left, int right) {
if (left != mIndicatorLeft || right != mIndicatorRight) {
// If the indicator's left/right has changed, invalidate
mIndicatorLeft = left;
mIndicatorRight = right;
ViewCompat.postInvalidateOnAnimation(this);
}
}
PS: 简单描述下结合ViewPager使用时,TabLayout如何处理指示器绘制的
updateIndicatorPosition() 和 animateIndicatorToPosition() 调用了setIndicatorPosition(),为了定制指示器,需要修改这两个方法。在updateIndicatorPosition()方法中,从某个Tab项 -> 下一个Tab项(右侧的Tab),mSelectionOffset 的变化范围为[0,1],其实mSelectionOffset 和mSelectedPosition对应的就是ViewPager的scrollOffset和position,根据变化和需求计算得到left和right,就可以改变指示器的长度,如:
private void updateIndicatorPo