自定义标签指示器(箭头向下,如指示器)

时间:2015-12-12 01:14:03

标签: android android-studio tabs indicator pagerslidingtabstrip

enter image description here

有没有像这样的指示器? 它有一些像所选项目中的尖箭头?

3 个答案:

答案 0 :(得分:19)

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

事实上,要获得此自定义指向箭头,您需要做的就是覆盖SlidingTabStrip的{​​{1}}方法。不幸的是,void draw(Canvas canvas) SlidingTabStrip内的private是内部类。

enter image description here

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

void draw(Canvas canvas)

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

要制作我的自定义 @Override public void draw(Canvas canvas) { super.draw(canvas); // i used <dimen name="pointing_arrow_size">3dp</dimen> 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; } ,我必须将这些文件复制到我的项目中:

  • AnimationUtils
  • TabLayout
  • ThemeUtils
  • ValueAnimatorCompat
  • ValueAnimatorCompatImplEclairMr1
  • ValueAnimatorCompatImplHoneycombMr1
  • ViewUtils
  • ViewUtilsLollipop

要在箭头后面设置透明度,您只需将此TabLayoutWithArrow - Shape设置为drawable的{​​{1}}:

background

实际用法是:

TabLayoutWithArrow

我已将整个项目(TabLayoutWithArrow +使用它的单页应用)上传到我的保管箱 - feel free to check it out

我希望,这有帮助

答案 1 :(得分:1)

现在它不起作用,tintmanager类从支持库23.2.0中删除,我通过在运行时更改后台drawable来管理相同的功能,用于循环检测点击位置,PS:检查这个问题和答案我正在使用同一个图书馆:https://github.com/astuetz/PagerSlidingTabStrip/issues/141

答案 2 :(得分:0)

以下是使用@Konstantin Loginov代码的任何需要向上三角形的代码

Firefox