每日一问:Android 如何处理滑动冲突

888真人娱乐全讯网

坚持原有的一天,短而快的Android高级系列,请直接在微信公众号上搜索:nanchen,直接关注并设置为明星,精彩不容错过。

在Android开发中,滑动冲突始终是一个不可避免的主题。对解决方案有不同的看法。例如,嵌套直接通过相关方法禁用内部滑动;嵌套直接替换它等等。但是我们今天所说的是当我们在自定义视图中遇到滑动冲突时应该怎么做?

当然,今天的主题要求View的事件分发机制作出理论前提。不了解View的事件分发机制的小伙伴可以转到我之前的访谈系列中的一篇文章:访谈系列:告诉我们Android的事件分发机制。

当然,这里也简单提一下,基本过程就是以下伪代码。

收到事件时,首先调用该方法以调度该事件。如果返回,则表示当前View将拦截该事件,并且回调方法直接用于事件处理。如果不拦截,直接回调子View的方法,依此类推,直到最里面的子View。

生成单击事件时,其传递过程遵循以下顺序:=>=>也就是说,事件总是传递给,然后传递给,最后传递给顶层,然后以与上面相同的方式。

处理事件从最内层连续传递回外层。如果尚未处理,它将直接返回中间。

回来代表自己处理。

由于我已经提到过这一点,我突然想给出一些结论,参考Android的艺术探索:

从手指触摸屏幕(ACTION_DOWN)到手指离开屏幕的那一刻(ACTION_UP),同一事件序列结束,其间有无限数量的事件。

一旦View决定拦截一个事件,那么这个事件序列只能由它处理,并且不再调用它的方法。换句话说,例如,ViewGroup有几个子视图。一旦ACTION_DOWN事件从Activity传递到ViewGroup,后续事件(如MOVE和UP)将不会传递给子视图。

如果View开始处理事件,如果它不使用ACTION_DOWN事件,则返回false,然后同一事件序列中的其他事件将不会被移交给它,并且将直接调用其父View。

如果View不使用ACTION_DOWN以外的事件,则click事件将消失,不会调用父元素,当然View可以继续接收后续事件,最后这些消失的点击事件将被传递给处理。

默认情况下,ViewGroup不拦截事件。 View没有方法。一旦事件传递给它,它将被直接调用,默认情况下将使用该事件。除非它不可点击(即两者兼而有之)。 View的默认值是,例如,默认为默认值为。

视图的属性不会影响默认返回值,即使它是一个状态,只要它有一个或一个,然后它将返回。

父元素的事件调度过程可以在子元素中受到干扰,但不能干预ACTION_DOWN事件。

事件优先级:=>=>

我不小心发现它们中有很多。当然,这些都是结论。您可以按照访谈系列:谈谈Android事件分发机制。讨论源代码过程。你会发现上面的结论很容易得到。

对于大多数Android开发来说,似乎很难处理滑动冲突,但实际上,它似乎很简单,因为这实际上是一个例程。基本上有两种选择:外部拦截方法&&内部拦截方法。

外部拦截方法

所谓的外部拦截方法,顾名思义,直接在父容器中直接拦截我们的滑动事件,这样它就不能进入子元素,当我们嵌套时,它似乎与内部滑动有这样的相似性,是,内部不是处理结束。但细节完全不同。这里的外部拦截方法将使内部元素根本不接收滑动事件。

这种方法显然非常适合我们上面谈到的事件分发机制。当我们收到一个事件时,我们可以通过返回方法直接拦截事件。每个人都必须知道伪代码:

代码非常简单,我们只需要在事件中处理我们的逻辑,当我们遇到逻辑时,我们将拦截事件以供我们自己处理。

至于为何不拦截,我认为每个人都很清楚。如上所述,如果事件被截获,则不会调用后续事件(例如其他事件),并将其移交给当前容器进行处理。如果我们拦截它,它肯定会导致子元素的click事件被处理,因为每个人都知道click事件从结束开始并在结束时结束。

内部拦截方法

内部拦截方法比外部拦截方法更复杂,因此我们一般建议使用外部拦截方法进行处理。但是,内部拦截方法仍然有其非常重要的地位,可能会遇到具体情况。

如果内部拦截方法需要方法的支持,这个方法是什么?顾名思义,请求不允许拦截事件,它接收一个参数,指示是否允许拦截。

我们直接覆盖子元素方法并获取伪代码,如下所示:

据推测,代码也非常简单易懂。我们传递给父容器的参数表明是否不允许拦截事件。当参数为时,表示不允许拦截,这意味着拦截。因此看起来外部拦截方法完全相同。

但是,进行此修改是不够的。我们从前面的理论基础知道,当我们的父容器拦截事件时,所有事件都不能再传递给子元素,我们自然不会调用上面的事件。方法消失了。因此,当我们拦截内部方法时,我们需要覆盖父容器的方法。

到目前为止,已经引入了两种处理滑动冲突的解决方案。自定义视图时,可以将其与实际场景组合。

除了滑动冲突之外,滑动处理也是一项非常有趣的工作,您可以参考NestedScrollingParent2和NestedScrollingChild2以获得您的兴趣。

文章参考:《Android 开发艺术探索》