gpt4 book ai didi

android - 如果 subview 返回 false,则让父 View 承担 MotionEvents

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:56 26 4
gpt4 key购买 nike

我有一个应用程序需要以不寻常的方式处理事件。

对于我的问题,我先说明一个简单的案例,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。

所以我发现返回 false onTouchEvent 的 ScrollView 父级可以假设它是事件,我写了这个 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 会使任何进一步的事件被分派(dispatch)给父级,但是我需要这些事件来进行垂直滚动,所以我有想法只有在用户水平移动时才返回 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:MovementTracker 会在某些事件发生后在 track() 上返回 true,并告知用户移动的方向。

但在那种情况下,ScrollView 会继续接收事件,因为它会在第一个事件上返回 true。

关于当 ViewSwiper 的子项返回 false(即使返回了一些 trues)时我如何处理 ViewSwiper 上的事件的任何想法。

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 将在两个 View 上执行。并且由于它们不冲突(一个是垂直的,另一个是水平的)这可以工作

关于android - 如果 subview 返回 false,则让父 View 承担 MotionEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7324490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com