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);
}
}
}
}
将谨慎的搜索栏属性设置为 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);
}
}
}
}