gpt4 book ai didi

android - Android 中 ScrollView 中的 MotionEvent 处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:09:46 25 4
gpt4 key购买 nike

我一直在尝试找出 Android 中 ScrollViews 中 MotionEvents 的行为,但有些事情我无法弄清楚。

例如,我创建了一个 Activity,其中有一个 ScrollView,而 ScrollView 有一个 LinearLayout。我实现了自己的类来控制与触摸相关的功能:

    public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

MyInnerLayout inner = new MyInnerLayout(getApplicationContext());
MyLayout layout = new MyLayout(getApplicationContext());

layout.addView(inner,new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
setContentView(layout);

}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i("scrollview","activity dispatchTouchEvent "+ev.getAction());
return super.dispatchTouchEvent(ev);
};

@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.i("scrollview","activity on touch "+ev.getAction());
return super.onTouchEvent(ev);
}




public class MyLayout extends ScrollView {

public MyLayout(Context context) {
super(context);
}

@Override
public boolean dispatchKeyEvent(KeyEvent ev) {
Log.i("scrollview","layout dispatchKeyEvent "+ev.getAction());
return super.dispatchKeyEvent(ev);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i("scrollview","layout onInterceptTouchEvent "+ev.getAction());
return false;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.i("scrollview","layout on touch "+ev.getAction());
return false;
}

}

public class MyInnerLayout extends LinearLayout{

public MyInnerLayout(Context context) {
super(context);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i("scrollview","inner layout dispatchTouchEvent "+ev.getAction());
return true;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i("scrollview","inner layout onInterceptTouchEvent "+ev.getAction());
return true;
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
Log.i("scrollview","inner layout on touch "+ev.getAction());
return true;
}

}

}

当我点击屏幕上的任何地方时,我得到这个日志:

10-14 18:11:48.631: I/scrollview(14906): activity dispatchTouchEvent 0
10-14 18:11:48.631: I/scrollview(14906): layout onInterceptTouchEvent 0
10-14 18:11:48.631: I/scrollview(14906): layout on touch 0
10-14 18:11:48.631: I/scrollview(14906): activity on touch 0
10-14 18:11:48.647: I/scrollview(14906): activity dispatchTouchEvent 1
10-14 18:11:48.647: I/scrollview(14906): activity on touch 1

这意味着触摸事件没有到达 ScrollView 内的内部布局。然而,当我将 ScrollView 更改为 LinearLayout(只需在扩展中更改它)时,事件就会下降到内部布局:

10-14 18:24:08.975: I/scrollview(15115): activity dispatchTouchEvent 0
10-14 18:24:08.975: I/scrollview(15115): layout onInterceptTouchEvent 0
10-14 18:24:08.975: I/scrollview(15115): inner layout dispatchTouchEvent 0
10-14 18:24:09.045: I/scrollview(15115): activity dispatchTouchEvent 1
10-14 18:24:09.045: I/scrollview(15115): layout onInterceptTouchEvent 1
10-14 18:24:09.045: I/scrollview(15115): inner layout dispatchTouchEvent 1

我查看了 the source code of the ScrollView class它覆盖的唯一与触摸相关的方法是我自己覆盖的方法。所以我不明白是什么造成了 LinearLayout 和 ScrollView 的行为之间的差异。

最佳答案

也许您已经弄清楚为什么会出现上述行为,但为了以防万一您不明白,这里是原因。

概览

onInterceptTouchEvent() 被自上而下(从父级到子级)调用,使一个 View 能够在被子级处理之前拦截运动事件。

onTouchEvent() 自下而上(从子级到父级)调用,直到其中一个消耗它并且循环结束。

ScrollView 拦截 MotionEvent 以检查它是否应该在将 View 传递给 child 之前 ScrollView 。如果应该执行滚动,则事件被消耗并且 subview 什么也看不到。

LinearLayout 的情况下,没有理由在 onInterceptTouchEvent() 期间消耗事件,并​​且总是传递给 subview 。

您的代码中发生了什么

因为 MyInnerLayout 是空的,所以 ScrollView 总是消耗 MotionEvent

例如,如果您像这样设置内部布局背景:

    MyInnerLayout inner = new MyInnerLayout(getApplicationContext());
inner.setBackground(getResources().getDrawable(R.drawable.ic_launcher));
MyLayout layout = new MyLayout(getApplicationContext());

你会看到,如果你触摸背景图片,事件就会到达 child 。如果您触摸背景图像之外的区域,该事件将由 ScrollView 消耗。

希望这对您有所帮助。

问候。

关于android - Android 中 ScrollView 中的 MotionEvent 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884250/

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