Android 自定义选项卡指示器(带有类似箭头向下的指示器)

Android 自定义选项卡指示器(带有类似箭头向下的指示器),android,android-studio,tabs,indicator,pagerslidingtabstrip,Android,Android Studio,Tabs,Indicator,Pagerslidingtabstrip,是否有一个wat来制作这样的指示器? 它有一些指向下的箭头,如所选项目中的箭头 我能找到的唯一解决方案是获取原始TabLayout的源代码,并根据您的需要进行定制 事实上,要获得这个定制的指向箭头,您所需要做的就是覆盖slidengtastrip的void draw(Canvas Canvas)方法。不幸的是,slidengtastrip是private内部类TabLayout 幸运的是,所有的支持库代码都是开放的,所以我们可以创建自己的tablayouthArrow类。我将标准的void d

是否有一个wat来制作这样的指示器?

它有一些指向下的箭头,如所选项目中的箭头

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

事实上,要获得这个定制的指向箭头,您所需要做的就是覆盖
slidengtastrip
void draw(Canvas Canvas)
方法。不幸的是,
slidengtastrip
private
内部类
TabLayout

幸运的是,所有的支持库代码都是开放的,所以我们可以创建自己的
tablayouthArrow
类。我将标准的
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;
        }
实际使用情况如下:

<klogi.com.viewpagerwithdifferentmenu.CustomTabLayout.TabLayoutWithArrow
    android:id="@+id/tabLayout"
    android:background="@drawable/tab_layout_background"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

我已经将整个项目(TabLayoutWithArrow+正在使用它的一页应用程序)上传到我的dropbox-


我希望,它有帮助

现在它不起作用了,tintmanager类从支持库23.2.0中删除,我通过在运行时为循环位置更改后台可绘制来管理相同的功能,PS:检查这个问题并回答我使用的是同一个库:

这是使用@Konstantin Loginov代码需要向上三角形的人的代码

private Path getTrianglePath(int arrowSize) {

        mSelectedIndicatorPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mSelectedIndicatorPaint.setAntiAlias(true);
        mSelectedIndicatorPaint.setColor(Color.WHITE);

        int leftPointX = mIndicatorLeft + (mIndicatorRight - mIndicatorLeft) / 2 - arrowSize * 1 / 2;
        int mTopX = leftPointX + arrowSize;
        int mTopY = getHeight() - arrowSize;
        int rightPointX = leftPointX + arrowSize * 2;

        int leftPointY = getHeight();

        Point left = new Point(leftPointX, leftPointY);
        Point right = new Point(rightPointX, leftPointY);
        Point bottom = new Point(mTopX, mTopY);

        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;
    }

它工作正常,我们如何增加指示器的高度?你有办法恢复三角形吗?
private Path getTrianglePath(int arrowSize) {

        mSelectedIndicatorPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mSelectedIndicatorPaint.setAntiAlias(true);
        mSelectedIndicatorPaint.setColor(Color.WHITE);

        int leftPointX = mIndicatorLeft + (mIndicatorRight - mIndicatorLeft) / 2 - arrowSize * 1 / 2;
        int mTopX = leftPointX + arrowSize;
        int mTopY = getHeight() - arrowSize;
        int rightPointX = leftPointX + arrowSize * 2;

        int leftPointY = getHeight();

        Point left = new Point(leftPointX, leftPointY);
        Point right = new Point(rightPointX, leftPointY);
        Point bottom = new Point(mTopX, mTopY);

        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;
    }