📜  Android 中的触控和事件

📅  最后修改于: 2022-05-13 01:58:44.929000             🧑  作者: Mango

Android 中的触控和事件

今天几乎所有的安卓手机都是触摸控制的。很少有手机没有触摸屏。在本文中,我们将讨论如何在 Android 中处理触摸事件。了解当我们点击屏幕时如何处理触摸控件和触摸事件就是一个例子。我们将讨论 Android 的触摸事件如何在内部为任何视图工作。那么,输入事件究竟是如何工作的,当我们有一个包含多个视图的 ViewGroup 时,当我们触摸屏幕时会发生什么?在这种情况下,我们将查看一个带有按钮的 LinearLayout,例如:

Image #1:线性布局和按钮。

我们将在这篇关于极客的极客文章中讨论的是,

  1. 当我们将手指按在屏幕上时会发生什么?
  2. 我们如何停止触摸事件?
  3. 触摸是如何处理的?
  4. 我们在 Android 中使用哪些主要的触摸事件来处理触摸控制?
  5. 当我们将手指按在屏幕上时会发生什么?

所以,当我们触摸屏幕时,activity的view,也就是Android中的DecorView,首先接收到触摸事件通知。现在,我们通常不使用 DecorView 触摸。结果,触摸被传输到 ViewGroup,然后传输到 XML 文件中的子项。

但是我们如何移动触摸事件触发器呢?

使用dispatchTouchEvent ,Android 中的 ViewGroup 将触摸事件在 ViewGroup 层次结构中从上到下传递给它的 children ()。

图片 #2:调度事件模块

我们如何停止触摸事件?

首先,当我们执行触摸动作时,ViewGroup 会接收到触摸事件,并在 ViewGroup 内使用 onInterceptTouchEvent() 对其进行拦截。

一般来说,如果我们返回 true,则意味着我们在 ViewGroup 本身内处理了事件,并且不需要向其子级分派。我们现在拥有的视图是视图树中的最后一个视图,如按钮所示。结果,它将不再能够将触摸事件传递给它的孩子,因为它不再有任何。因此,在按钮中,我们的最后一个onInterceptTouchEvent将被调用。

在这个视图中,触摸是如何处理的?

我们需要检查我们考虑的所有视图的层次结构,然后执行我们的工作。处理事件是关于分配给所有事物的优先级,第一个,然后它移向 ViewGroups。触摸事件的函数类似于事件分派,但从子到父的顺序相反。假设我们从 ViewGroup 发送事件并在那里拦截它;返回值 (true/false) 确定视图的触摸是在 ViewGroup 上还是在子级上处理。

图片 #3:dispatchTouchEvent 和 onTouch

所以,在本文中,从按钮收到的反馈全部返回true,表示已经处理,不会发送到LinearLayout。

我们在 Android 中使用哪些主要的触摸事件来处理触摸控制?

当我们收到一个触摸事件时,它由 onTouchEvent 处理,它也有一个 MotionEvent 参数。

Kotlin
fun onTouchEvent(event: MotionEvent)


event 参数包含对与触摸相关的每个执行任务的引用。在触摸点的屏幕上,我们可以有X、Y等坐标。它甚至还有动作,例如,如果我们点击屏幕,就会调用 MotionEvent.ACTION DOWN,如果我们抬起手指,就会调用 MotionEvent.ACTION UP。即使您使用 MorionEvent.ACTION MOVE 在屏幕上拖动手指,动作也是 MotionEvent。因此,当我们想要点击按钮时,视图上的流程就会发生。

当我们不想点击按钮但仍想处理LinearLayout上的点击时,流程如下:

结论

  1. 在处理触摸事件时,我们首先单击一个视图,然后移除手势(在我们的例子中,我们的手指/触控笔),之后 MotionEvent。 ACTION DOWN和 MotionEvent。调用ACTION UP
  2. 当 ViewGroup 上发生初始触摸并且子级被拦截时。
  3. 运动事件。在 ViewGroup 上调用ACTION CANCEL并将触摸事件分派给子项。
  4. 现在一切都取决于 onInterceptTouchEvent() 的返回值。
  5. dispatchTouchEvent 依赖于它的返回值;如果返回 true,则调度程序被取消;如果它返回 false,则触摸事件的调度将继续,直到它被使用。
  6. 如果 onTouchEvent() 返回 true,则表示触摸已处理;如果返回 false,则表示未处理触摸