android动态指示箭头,自定义选项卡指示器(箭头向下指示器)

这篇博客分享了如何通过获取TabLayout的源代码并进行自定义,以实现带有箭头指示器的TabLayout。作者详细介绍了覆盖SlidingTabStrip的draw方法来绘制箭头,并提供了自定义的TabLayoutWithArrow类的实现,包括绘制三角形路径的方法。此外,还给出了如何设置背景以实现箭头后的透明度效果。最后,提供了完整的项目源码供读者参考。

我能find的唯一解决方案是获取原始TabLayout的源代码并根据您的需要TabLayout进行自定义。

事实上,你需要做的就是覆盖SlidingTabStrip的void draw(Canvas canvas)方法。 不幸的是, SlidingTabStrip是SlidingTabStrip中的private内部类。

dZwhz.gif

幸运的是,所有支持库代码都是开放的,因此我们可以创建自己的TabLayoutWithArrow类。 我用这个替换了标准的void draw(Canvas canvas)来绘制箭头:

@Override public void draw(Canvas canvas) { super.draw(canvas); // i used 3dp int arrowSize = getResources().getDimensionPixelSize(R.dimen.pointing_arrow_size); if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) { canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight - arrowSize, mIndicatorRight, getHeight() - arrowSize, mSelectedIndicatorPaint); canvas.drawPath(getTrianglePath(arrowSize), mSelectedIndicatorPaint); } } private Path getTrianglePath(int arrowSize) { mSelectedIndicatorPaint.setStyle(Paint.Style.FILL_AND_STROKE); mSelectedIndicatorPaint.setAntiAlias(true); int leftPointX = mIndicatorLeft + (mIndicatorRight - mIndicatorLeft) / 2 - arrowSize*2; int rightPointX = leftPointX + arrowSize*2; int bottomPointX = leftPointX + arrowSize; int leftPointY = getHeight() - arrowSize; int bottomPointY = getHeight(); Point left = new Point(leftPointX, leftPointY); Point right = new Point(rightPointX, leftPointY); Point bottom = new Point(bottomPointX, bottomPointY); Path path = new Path(); path.setFillType(Path.FillType.EVEN_ODD); path.setLastPoint(left.x, left.y); path.lineTo(right.x, right.y); path.lineTo(bottom.x, bottom.y); path.lineTo(left.x, left.y); path.close(); return path; }

当然,背景,指标的特殊设计可以根据您的需要进行改进/调整。

要制作我的自定义TabLayoutWithArrow ,我必须将这些文件复制到我的项目中:

AnimationUtils

TabLayout

ThemeUtils

ValueAnimatorCompat

ValueAnimatorCompatImplEclairMr1

ValueAnimatorCompatImplHoneycombMr1

ViewUtils

ViewUtilsLollipop

要在箭头后面有透明度,你只需要设置这个Shape – drawable ,作为TabLayoutWithArrow的background :

而实际用途是:

我已将整个项目(TabLayoutWithArrow +使用它的单页应用程序)上传到我的Dropbox – 随时查看它 。

我希望,这有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值