当前位置:  开发笔记 > Android > 正文

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

如何解决《自定义标签指示器(箭头向下像指示器)》经验,为你挑选了1个好方法。

在此输入图像描述

是否有像这样的指标?
它有一些像所选项目中的尖箭头?



1> Konstantin L..:

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

事实上,所有你需要做的就是这个自定义箭头指向是重写SlidingTabStripvoid draw(Canvas canvas)方法.不幸的是,里面SlidingTabStripprivate内部阶级TabLayout.

在此输入图像描述

幸运的是,所有支持库代码都是开放的,因此我们可以创建自己的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作为 backgroundTabLayoutWithArrow:




    
        
            
        
    
    
        
            
        
    

而实际用途是:


我已将整个项目(TabLayoutWithArrow +使用它的单页应用程序)上传到我的保管箱 - 随时查看它.

我希望,这有帮助

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有