我想做以下任何一项。
1) 只允许在我的视图上滑动/滑动并禁用单击、长按和其他事件。
或者
2)在我的视图之上覆盖另一个视图,只允许滑动/甩动/滚动事件传递到它下面的视图。
是否有可能在Android中做到这一点?
我想做以下任何一项。
1) 只允许在我的视图上滑动/滑动并禁用单击、长按和其他事件。
或者
2)在我的视图之上覆盖另一个视图,只允许滑动/甩动/滚动事件传递到它下面的视图。
是否有可能在Android中做到这一点?
使用示例GetureDetector
。
public class Main extends Activity implements OnGestureListener {
private GestureDetector gDetector;
TextView ViewA;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gDetector = new GestureDetector(this);
ViewA = (TextView)findViewById(R.id.txtView);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
viewA.setText("-" + "FLING" + "-");
return true;
}
@Override
public void onLongPress(MotionEvent e) {
viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
viewA.setText("-" + "SCROLL" + "-");
return true;
}
@Override
public void onShowPress(MotionEvent e) {
viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
viewA.setText("-" + "SINGLE TAP UP" + "-");
return true;
}
}
以下是在 GestureDetector 类下使用触摸事件的方法。您可以控制每个事件。
希望对你有所帮助。
我找到了一个适合我的情况的 hacky 解决方案,但它显然是一个 hack。在 ViewGroup 的 onInterceptTouchEvent 中,如果之前有 MotionEvent.ACTION_DOWN 事件,我会吃掉所有的 MotionEvent.ACTION_UP。吃我的意思是我会从函数中返回true,并且动作取消将被发送到子视图,该子视图获得初始向下事件,因此点击将被忽略。然而,卷轴、甩动等按预期工作。
如果有人尝试这样做,则为代码示例。这里 lastMotionDown 是一个类级别的布尔变量。
public boolean onInterceptTouchEvent(MotionEvent e) {
if (this.lastMotionDown) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
this.lastMotionDown = true;
return false;
}
this.lastMotionDown = false;
if (e.getAction() == MotionEvent.ACTION_UP) {
//A click has happened prevent it.
return true;
}
}else {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
this.lastMotionDown = true;
}
return false;
}
return false;
}