我有以下类,它代表一个可触摸的视图并绘制一个滑动条。
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 并且没有进一步的事件。
为什么会出现这样的情况呢?我不想取消该事件并使其继续拖动栏。
当父容器拦截您的触摸事件时,就会发生这种情况。任何覆盖的 ViewGroupViewGroup.onInterceptTouchEvent(MotionEvent) http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29可以做到这一点(例如 ScrollView 或 ListView)。
处理这个问题的正确方法是调用ViewParent.requestDisallowInterceptTouchEvent(布尔值) http://developer.android.com/reference/android/view/ViewParent.html#requestDisallowInterceptTouchEvent%28boolean%29一旦您认为需要保留运动事件,请在您的父视图上使用方法。
这是一个简单的示例(attemptClaimDrag 方法取自 android 源代码):
/**
* Tries to claim the user's drag motion, and requests disallowing any
* ancestors from stealing events in the drag.
*/
private void attemptClaimDrag() {
//mParent = getParent();
if (mParent != null) {
mParent.requestDisallowInterceptTouchEvent(true);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (iWantToKeepThisEventForMyself(event)) {
attemptClaimDrag();
}
//your logic here
} else {
//your logic here
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)