我有以下类代表可触摸的视图并绘制滑动条。
public class SlideBar extends View {
private int progress;
private int max;
private Paint background;
private Paint upground;
private RectF bar;
private boolean firstDraw;
public SlideBar(Context context, AttributeSet attrs) {
super(context, attrs);
progress = 0;
upground = new Paint();
upground.setColor(Color.parseColor("#C2296C"));
background = new Paint();
background.setColor(Color.parseColor("#777777"));
}
private void onFirstDraw() {
max = getWidth();
bar = new RectF(0, 19, max, 21);
}
public void onDraw(Canvas canvas) {
if (!firstDraw) {
onFirstDraw();
progress = max;
firstDraw = true;
}
canvas.save();
canvas.drawRoundRect(bar, 5, 5, background);
canvas.drawCircle(progress, 20, 9, upground);
canvas.restore();
}
public void setValue(int value) {
progress = value;
}
public boolean onTouchEvent(MotionEvent evt) {
System.out.println(evt.getAction());
progress = (int) evt.getX();
invalidate();
return false;
}
}
但是当触摸和拖动它时,我收到一个 ACTION_DOWN,然后一些 ACTION_MOVE 收到一个 ACTION_CANCEL 并且没有进一步的事件。
为什么会这样?我不想取消事件并使其继续拖动栏。
原文由 Marcos Vasconcelos 发布,翻译遵循 CC BY-SA 4.0 许可协议
ACTION_CANCEL
当父视图接管其子视图之一时发生。查看有关 ViewGroup.onInterceptTouchEvent(MotionEvent) 方法的文档。从链接:
onTouchEvent()
方法来处理;这意味着您应该实施onTouchEvent()
以返回 true,这样您将继续看到手势的其余部分(而不是寻找父视图来处理它)。此外,通过从onTouchEvent()
返回 true,您将不会在onInterceptTouchEvent()
中收到任何后续事件,并且所有触摸处理必须发生在onTouchEvent()
onTouchEvent()
。ACTION_CANCEL
,所有进一步的事件将传递给您的onTouchEvent()
方法并不再出现在这里