Android 谨慎的搜索栏不显示小于 2 的最大值的刻度线

Android discreet seekbar not showing tickmarks for max values below 2

将谨慎的搜索栏属性设置为 android:max="1" 不会在搜索栏的两端显示刻度线,即使它是可搜索的。

但是设置 android:max="2" 显示三个刻度线。

如何使最大值 0 和 1 出现刻度线?

如果您查看 AbsSeekBar 的源代码,您会发现此方法:

/**
 * @hide
 */
protected void drawTickMarks(Canvas canvas) {
    if (mTickMark != null) {
        final int count = getMax() - getMin();
        if (count > 1) {
            final int w = mTickMark.getIntrinsicWidth();
            final int h = mTickMark.getIntrinsicHeight();
            final int halfW = w >= 0 ? w / 2 : 1;
            final int halfH = h >= 0 ? h / 2 : 1;
            mTickMark.setBounds(-halfW, -halfH, halfW, halfH);

            final float spacing = (getWidth() - mPaddingLeft - mPaddingRight) / (float) count;
            final int saveCount = canvas.save();
            canvas.translate(mPaddingLeft, getHeight() / 2);
            for (int i = 0; i <= count; i++) {
                mTickMark.draw(canvas);
                canvas.translate(spacing, 0);
            }
            canvas.restoreToCount(saveCount);
        }
    }
}

重要的部分是行if (count > 1);无论出于何种原因,Google 团队决定如果只有两个可选值,则不应显示刻度线。

没有解决此问题的好方法。

您必须覆盖整个方法,但它带有 @hide 注释,这意味着外界不应该知道它。这实际上不会 阻止 你这样做,但这意味着你总是不得不担心它会在 Android 更新时中断。

另一个问题是此方法使用了很多您无权访问的字段。您可以使用吸气剂来解决这个问题,但它有点粗糙。

放在一起,你可以做这个class:

public class MySeekBar extends SeekBar {

    public MySeekBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    protected void drawTickMarks(Canvas canvas) {
        if (getTickMark() != null) {
            final int count = getMax() - getMin();

            // this is the important part: you change this to 0 from 1

            if (count > 0) {
                final int w = getTickMark().getIntrinsicWidth();
                final int h = getTickMark().getIntrinsicHeight();
                final int halfW = w >= 0 ? w / 2 : 1;
                final int halfH = h >= 0 ? h / 2 : 1;
                getTickMark().setBounds(-halfW, -halfH, halfW, halfH);

                final float spacing = (getWidth() - getPaddingLeft() - getPaddingRight()) / (float) count;
                final int saveCount = canvas.save();
                canvas.translate(getPaddingLeft(), getHeight() / 2);
                for (int i = 0; i <= count; i++) {
                    getTickMark().draw(canvas);
                    canvas.translate(spacing, 0);
                }
                canvas.restoreToCount(saveCount);
            }
        }
    }
}