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

时间:2018-12-19 16:04:20

标签: android seekbar

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

但是设置 android:max =“ 2” 会显示三个刻度。

如何使刻度标记显示为最大值0和1?

1 个答案:

答案 0 :(得分:0)

如果您查看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更新时会中断。

另一个问题是此方法使用了许多您无权访问的字段。您可以使用getter来解决此问题,但这有点麻烦。

放在一起,您可以创建此类:

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