java垂直SeekBar Android,如何使用SetProgress()更新滑块位置
我知道我不是第一个对安卓上的VerticalSlider有问题的人,但尽管我记得我一开始就努力让它工作,但这是我第一次有一个部分工作的setProgress()
事情是这样的。 代表滑块的蓝线已正确更新,但本应移动的微小“按钮”根本不移动。(见图片)
蓝线根据我发送的值移动,但“按钮”不移动。它正在移动一点,但根本不跟随蓝线——这是正确的。(如果您对“按钮”和蓝线有更好的定义,请随意编辑。可能是进度线?)
这是我对垂直滑块的代码:
import 安卓.content.Context;
import 安卓.graphics.Canvas;
import 安卓.util.AttributeSet;
import 安卓.util.Log;
import 安卓.view.MotionEvent;
import 安卓.widget.SeekBar;
public class VerticalSeekBar extends SeekBar {
public VerticalSeekBar(Context context) {
super(context);
}
public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public VerticalSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw);
}
@Override
protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
protected void onDraw(Canvas canvas) {
canvas.rotate(-90);
canvas.translate(-getHeight(), 0);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled())
return false;
boolean result = false;
if (event.getAction() != MotionEvent.ACTION_MOVE) {
// Prevent duplicate haptic feedback events (due to
// setProgress() below)
boolean hf = isHapticFeedbackEnabled();
setHapticFeedbackEnabled(false); {
// This is required for OnSeekBarChangeListener.on{Start,Stop}TrackingTouch()
result = super.onTouchEvent(event);
} setHapticFeedbackEnabled(hf);
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_MOVE:
// Vertical scrolling
setProgress(getMax() - (int)(getMax() * event.getY()/getHeight()));
onSizeChanged(getWidth(), getHeight(), 0, 0);
result = true;
break;
}
return result;
}
public void customSetProgress(int progress) {
setProgress(progress);
onSizeChanged(getWidth(), getHeight(), 0, 0);
}
}
这就是我更新滑块的方式:
float value = //... Get the value here from other computations
// We need to use int for the slider
final int step = 1;
final int max = (int)MAXPRECISION * 100;
final int min = (int)MINPRECISION * 100;
final double initialPosition = (double)max ;
final int valueInt = (int) (value * 100) ;
final VerticalSeekBar sliderPrecision = (VerticalSeekBar)findViewById(R.id.verticalSliderPrecision);
sliderPrecision.setProgress(valueInt);
sliderPrecision.setMax( (max - min) / step ); //To make sure it is updated as seen in some SO post.
我很有信心我的VerticalSlider类很好,因为多年前我已经能够正确地使用它了。所以代码的其余部分肯定有问题,但我找不到可能是什么
至于这里的图像,它们是:
# 1 楼答案
所以我发现这可以通过调用
onSizeChanged(getWidth(), getHeight(), 0, 0);
来解决因此,我创建了一个更新的VerticalSeekBar,它现在运行良好。 我真的希望它能帮助其他与他们斗争的人
以下是更新的类:
导入android。所容纳之物上下文 导入android。图样帆布 导入android。util。属性集; 导入android。util。日志 导入android。看法运动事件; 导入android。小装置。西格巴