Android 中的触控和事件
今天几乎所有的安卓手机都是触摸控制的。很少有手机没有触摸屏。在本文中,我们将讨论如何在 Android 中处理触摸事件。了解当我们点击屏幕时如何处理触摸控件和触摸事件就是一个例子。我们将讨论 Android 的触摸事件如何在内部为任何视图工作。那么,输入事件究竟是如何工作的,当我们有一个包含多个视图的 ViewGroup 时,当我们触摸屏幕时会发生什么?在这种情况下,我们将查看一个带有按钮的 LinearLayout,例如:
我们将在这篇关于极客的极客文章中讨论的是,
- 当我们将手指按在屏幕上时会发生什么?
- 我们如何停止触摸事件?
- 触摸是如何处理的?
- 我们在 Android 中使用哪些主要的触摸事件来处理触摸控制?
- 当我们将手指按在屏幕上时会发生什么?
所以,当我们触摸屏幕时,activity的view,也就是Android中的DecorView,首先接收到触摸事件通知。现在,我们通常不使用 DecorView 触摸。结果,触摸被传输到 ViewGroup,然后传输到 XML 文件中的子项。
但是我们如何移动触摸事件触发器呢?
使用dispatchTouchEvent ,Android 中的 ViewGroup 将触摸事件在 ViewGroup 层次结构中从上到下传递给它的 children ()。
我们如何停止触摸事件?
首先,当我们执行触摸动作时,ViewGroup 会接收到触摸事件,并在 ViewGroup 内使用 onInterceptTouchEvent() 对其进行拦截。
Geek Tip: If we return true after intercepting, the touch event is not passed to its children; if we return false, the Android eco-system is notified that the ViewGroup wants to dispatch the event to its children, which in our case is a button.
一般来说,如果我们返回 true,则意味着我们在 ViewGroup 本身内处理了事件,并且不需要向其子级分派。我们现在拥有的视图是视图树中的最后一个视图,如按钮所示。结果,它将不再能够将触摸事件传递给它的孩子,因为它不再有任何。因此,在按钮中,我们的最后一个onInterceptTouchEvent将被调用。
在这个视图中,触摸是如何处理的?
我们需要检查我们考虑的所有视图的层次结构,然后执行我们的工作。处理事件是关于分配给所有事物的优先级,第一个,然后它移向 ViewGroups。触摸事件的函数类似于事件分派,但从子到父的顺序相反。假设我们从 ViewGroup 发送事件并在那里拦截它;返回值 (true/false) 确定视图的触摸是在 ViewGroup 上还是在子级上处理。
所以,在本文中,从按钮收到的反馈全部返回true,表示已经处理,不会发送到LinearLayout。
我们在 Android 中使用哪些主要的触摸事件来处理触摸控制?
当我们收到一个触摸事件时,它由 onTouchEvent 处理,它也有一个 MotionEvent 参数。
Kotlin
fun onTouchEvent(event: MotionEvent)
event 参数包含对与触摸相关的每个执行任务的引用。在触摸点的屏幕上,我们可以有X、Y等坐标。它甚至还有动作,例如,如果我们点击屏幕,就会调用 MotionEvent.ACTION DOWN,如果我们抬起手指,就会调用 MotionEvent.ACTION UP。即使您使用 MorionEvent.ACTION MOVE 在屏幕上拖动手指,动作也是 MotionEvent。因此,当我们想要点击按钮时,视图上的流程就会发生。
onTouchEvent -> Activity -> dispatchTouchEvent (LinearLayout) -> dispatchTouchEvent (Button) -> onTouchEvent (Button).
当我们不想点击按钮但仍想处理LinearLayout上的点击时,流程如下:
Activity -> dispatchTouchEvent (LinearLayout) -> dispatchTouchEvent(Button) -> onTouchEvent(Button) (will return false) -> onTouchEvent(Button) -> onTouchEvent(Button) (will return false) -> onTouchEvent(Button) (LinearLayout).
结论
- 在处理触摸事件时,我们首先单击一个视图,然后移除手势(在我们的例子中,我们的手指/触控笔),之后 MotionEvent。 ACTION DOWN和 MotionEvent。调用ACTION UP 。
- 当 ViewGroup 上发生初始触摸并且子级被拦截时。
- 运动事件。在 ViewGroup 上调用ACTION CANCEL并将触摸事件分派给子项。
- 现在一切都取决于 onInterceptTouchEvent() 的返回值。
- dispatchTouchEvent 依赖于它的返回值;如果返回 true,则调度程序被取消;如果它返回 false,则触摸事件的调度将继续,直到它被使用。
- 如果 onTouchEvent() 返回 true,则表示触摸已处理;如果返回 false,则表示未处理触摸