android-如果子级返回false,则让父级视图承担MotionEvents
作者:互联网
我有一个需要以异常方式处理事件的应用程序.
对于我的问题,让我首先说明一个简单的案例,即当前的Android事件处理系统不适合我.
假设我有一个FrameLayout(从现在开始我将其称为ViewSwiper),其上添加的所有View均为MATCH_PARENT X MATCH_PARENT(我称为PageView),它通过转换实际View并根据方向替换它来处理事件的感动.
我已经完成并正常工作了该组件(Using Animation to swipe views).
但是问题在于我在其上添加的PageView上,如果ImageViews的onTouchEvent返回false,则ViewSwiper将处理事件并让另一个PageView进入屏幕,但是如果我在上面添加ScrollView,则所有事件将由Scroll占用,并且ViewSwiper将没有机会替换PageView.
因此,我发现返回父级的ScrollView的onTouchEvent错误可以假定它是事件,因此我编写了ScrollView的此子类来对其进行测试:
public class ScrollViewVertical extends ScrollView {
public ScrollViewVertical(Context context) {
super(context);
setOverScrollMode(OVER_SCROLL_ALWAYS);
setVerticalScrollBarEnabled(false);
}
public boolean onTouchEvent(MotionEvent evt) {
super.onTouchEvent(evt);
return false;
}
}
但是返回false将使任何其他事件被分派给父级,但是我需要这些事件来进行垂直滚动,因此我有一个想法,只有在用户移动水平方向时才返回false,这就是我的代码:
public class ScrollViewVertical extends ScrollView {
private MovementTracker moveTracker;
public ScrollViewVertical(Context context) {
super(context);
setOverScrollMode(OVER_SCROLL_ALWAYS);
setVerticalScrollBarEnabled(false);
moveTracker = new MovementTracker();
}
public boolean onTouchEvent(MotionEvent evt) {
if (moveTracker.track(evt))
if (moveTracker.getDirection() == Direction.HORIZONTAL)
return false;
return super.onTouchEvent(evt);
}
}
PS:MovealTracker将在发生某些事件后在track()上返回true,并告诉用户移动的方向.
但是在那种情况下,ScrollView会继续接收事件,因为它在第一个事件中返回true.
关于如何在ViewSwiper的子级返回false时如何处理事件的任何想法(即使返回了某些true).
PS:如果需要,我可以提供更多有关此的信息,也可以接受其他解决方案.
根据答案,我尝试了以下操作:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
onTouchEvent(ev);
return intercept;
}
public boolean onTouchEvent(MotionEvent evt) {
boolean x = super.onTouchEvent(evt);
if (moveTracker.track(evt)) {
intercept = moveTracker.getDirection() != Direction.VERTICAL;
if (!intercept)
getParent().requestDisallowInterceptTouchEvent(false);
}
return x;
}
依然没有.
解决方法:
在scrollview的onTouchEvent()中尝试一下
//if (evt.getAction() == MotionEvent.ACTION_MOVE) {
if (moveTracker.track(evt)){
if (moveTracker.getDirection() == Direction.VERTICAL){
//Or the direction you want the scrollview keep moving
getParent().requestDisallowInterceptTouchEvent(true);
}
}
return true;
更新资料
请尝试以下自定义Scrollview
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
super.dispatchTouchEvent(ev);
return false;
}
没别的
这样,我假设MotionEvent将在两个视图上执行.而且由于它们没有冲突(一个是垂直的,另一个是水平的),所以可以工作
标签:event-handling,android-event,android-scrollview,android 来源: https://codeday.me/bug/20191102/1989886.html