00:00
然后第二个问题呢,就是嗯,我们在这个操作的过程当中。啊,有的时候呢,感觉好像体验不是特别顺溜啊,比如呢,我们上边这是一个VIVO配置啊,这VO VIVO配置的话呢,我们发现它这个左右这样的话呢,就不断的在切换,包括我们自己拿手,我现在拿手这个动察啊,左右也可以去晃动啊,那这时候实际上我们表示的意思就是我现在拿呃手触碰的这个档或者木事件,按说呢,是不是应该由我们这个view配来消费啊呃而但是我们这个时候是如果用户也可以。上下动啊,你看这时候我上下动不了是吧。那你先等一等他啊。他这个在切换,然后我这时候我再。我在上下动。啊,你看总感觉好像这有点问题是吧。哎,这个时候呢,这不就涉及到一个什么事情呢,哎,应该说叫一个事件冲突的问题了。哎,什么叫时间冲突,就是本身我这个。啊,View Peter作为我们整个这个这块的叫sc view,它的一个指示图。
01:05
作为子视图出现的,但是呢,我们这时候呢,这个木事件到底是由这个view配置来消费,还是由我们这个sc view来消费,这时候呢,你得分一下吧。嗯,如果呢,你是希望用它来消费,或者说你在这的时候呢,其实你就得是指明一下啊。指明一下的话呢,就是嗯,比如说如果用户这个垂直方向上移动的距离。啊,是不是大于水平方向的移动距离。对吧,然后同时呢,你还可以再设置它垂直方向的这个值,比如超过一定的DP,比如说十个DP。呃,这种情况下,我认为用户实际上是想上下走上下滑,哎,就是相当于你想去滑动是这个sc view了啊,哎,那我就可以是不是让我们整个外部的这个俯视图去拦截这个死视图啊。对吧,哎,就可以这样子来做一个处理哈,这个呢,就是我们自定义控件里边其实比较难的一个问题,就是关于事件的一个拦截和反拦截的问题。
02:04
啊,那这里边儿我们出现的呢,就叫拦截。拦截是针对于谁,对谁实现的。哎,是不是父对子叫拦截呀啊,那子对父叫什么呀?哎,对子对父呢,叫反拦截。哎,反拦截在我们这个问题当中没有出现。啊,那举一个例子,法兰截有什么具体的情况呢?比如说呢,我们做过就像类似于QQ的这个水平滑动的这个效果吧。哎,对,这个就是一个策划,策划的话,它不是整个这个布局的策划,是这个每一个item都可以策划,因为整个我们这是一个list view。啊,这是一个一个item,这个item这块呢,不是还有比如说什么置顶啊,要为未读啊收藏呀等等的这样的几个小位置是吧?这个小位置的话,一上来的时候呢,他们就呈现在这边,所以看不着啊,哎,当用户往这块滑动的时候呢,诶是不是就可以划出来了,哎这个滑出来你想象一下啊,我这个滑实际上这时候我这个木事件是不是交给我们这个item的布局处理的呀。
03:12
哎,交给item这个布局处理好,我一划划到一半的时候。滑到一半或者正常,按我们的想法就是我假设用户这个滑这么长,假设啊,我举个例子,这是一个10DP,那用户往这边滑,我滑出来3DP。这我一撒开,是不是应该能回去啊?啊,那如果我超过5DP呢。一撒开是不是整个呈现出来啊,诶应该是这样子的,好,那现在有一个什么问题呢?就用户在往这块滑的时候呢,我在零跟10DP之间的一个范围的时候,我往这水平滑着滑着,可能一不小心我上下抖动了一下,你上下这个一抖,那这个时候就判断诶你是不是想垂直方向上动啊。啊,因为你垂直方向移动,你想想我们这外边是不是还是一个list view啊。那list view的话呢,本身它自己也可以来处理这个木时间,因为我是可以上下滑嘛,啊那这时候就出现个问题,呃,我在水平滑滑的时候呢,诶我上下移动就导致呢,这个list view又想去消费了,所以就会导致你假设滑到一半的时候呢,你一撒开上下动了一下,一撒开导致这个它就停留到半中间了。
04:21
哎,就可能会出现这样的问题,那此时呢,我们就相当于是不是让我们这个,呃,相较于来说,我们这个呢,叫item的布局。然后呢,你这是我们的这个。他的这个复试图,哎,让我去拦截对你反拦截对你的一个消费。哎,这句话这样说啊,应该是我们让这个子视图,这是你这个复视图啊,我在水平的时候呢,可能一不小心上下哆嗦了一下,但这候呢,我们也不让这个复视图去消费这个木。对吧,哎,这不就相当于是个叫反拦截的一个效果吗。嗯,就是这块呢,就是有应用的一些场景啊,那我们现在这里边用到了就叫拦截啊,啊拦截反拦截啊,应该说也是在我们这个事件处理的这个生命周期过程当中的啊哎,回头分享的时候呢,大家把这个给总结一下。
05:11
那行了,我们这时候呢,要执行一下了啊,那执行的话呢,我们可以把这个操作写到这儿。啊,那问大家一下这个,呃,现在我们这个写的叫拦截啊。这个拦截的话呢,我们前面不是还涉及到一个叫分发和处理是吧,这个应该说对应的是这个处理的一个回调方法吧。分发呢,就是dispatch了啊,那他们三者的这个顺序算是啥样的。嗯,对,这个就先不详细的去说这个事情了啊,这个详细的到时候再再去总结,然后呢,就是先是分发,分发完以后呢,先考虑是不是拦截了啊,如果没拦截再往里边走,再往里边再去分发这样的过程啊,然后呢,处理的时候呢,再往回返。
06:01
考虑这个onto这样一个过程。啊,这个是几组分享啊。你们组啊,像这块呢,这个还是有点难度啊,比较要绕这个好好的下来总结总结,到时候给大家讲清楚啊。行,那这个我们写这个拦截,拦截这个怎么写这个方法啊啊intercept它是event啊,那关键呢,我们关心的是不是就是这样的一个返回值了啊,波类型ISS我呢先给它写成个false啊。然后呢,我们先return一下,叫is。那这个呢,叫拦截啊,说实现复视图对子视图的一个。啊,一个拦截操作啊,那这个到底拦截成功与否。
07:05
啊,是否拦截成功。啊,取决于哎,这个方法的返回值啊,当返回值。为处。哎,这个呢,表示对,就是拦截成功啊,反之。要拦截失败啊,拦截失败呢,那就是这个消息继续往里发啊,是这样一个过程。行,那这个时候我们来看一下啊,那这个拦截到底什么时候我给它拦住,什么时候不拦,就是我们刚才说的这个事情啊,就是当你这个哎,垂直方向移动的距离大于水平的距离,而且呢,呃,垂直这个最好大于一定值的情况下,我就让你拦。啊行,我们这时候呢来处理,嗯,这个距离,那就是我们除了定义这个变量之外呢,还得再定义一些了,这个我们可以写到这儿啊。Private型的一个last啊,因为你涉及到X吧,啊啊,以及这个到X。
08:05
在道外啊。行,然后呢,一进来我们先去获取下你当前的这个位置啊,该塔X。一个。一分X啊,做一个强转接着。等于。行,然后呢,我们还是一个Switch。啊,Get一个action,那这呢,如果是一个motion even there are action,一个down来做处理,然后接着。Kiss某生疑问加爱神木。来做一个处理啊,这个里边呢,跟这个up呢关系不大。好看这个事情啊,呃,首先一进来,当你不断的去调换过程当中,我记录一下你当前这个位置啊,然后呢,当你是个当的时候呢,我们这样做一个处理,哎,记录一下啊,一个呢叫拉X等于当X等于even X。
09:02
啊,那Y等于。档Y等于Y,这个呢,应该在我们讲自定义空件的时候说过这个操作是吧,就拦截的时候这具体的一些这个写法了啊,那先做一个赋值,然后呢,这个目啊,目完了以后呢,记着把这个事儿写上啊,哎,防防止你忘了先给它加上。那这样啊,呃,因为我们这个操作呢,是早于这个操作的。所以呢,你看这块,诶,这不是在这写了吗?怎么上面还写呢,你这个早啊,对吧,这个晚啊,或者说你在这块呢,该写还得写上。嗯,行,嗯,当你是这个目的时候哈,我们在这里边来判断一下,是不是该做一个,哎,这个值的一个修改啊,我们这里边呢,刚才说了,看一下你垂直方向上移动的这个距离。啊,跟水平环移动这个距离,这个距离呢,应该是你最初档的时候。
10:01
啊,跟你当前移动到这个位置,当前移动到这个位置呢,就是我们这个X伙伴。哎,你最初的那个档的位置就是我们这个当X或者是当Y,所以我们应该算出它们两个之间的差值。啊,谁减谁谁大谁小,这个说不清楚啊,你往上可能这个答案你要往下呢,就那个答了,所以我们这呢,应该取绝对值对吧。1X减去一下啊SX。这呢,取一个绝对值啊,In的形的一个,然后叫ABS一个X吧,这样啊。嗯,好,这样的话呢,我就取出来它在水平和垂直方向上的移动距离。反方向。
11:01
的一个啊移动距离。呃,下面呢,我们就做这样的一个判断啊,说如果,嗯,如果这个垂直方向的距离呢,是大于,呃水平方向的一个距离啊同时呃要求我们这个ABS这个Y呢,呃它最好呢,还得大于等于吧,呃uiu就是点。嗯,十个DP吧,那在这种情况下呢,我就让这个is intercept。哎,我就等于个出来表示呢,就做一个拦截操作。那这样啊,那否则的话呢,我们这就不再去拦了,那G呢,就是用户有可能水平距离大于垂直到我就认为用户呢,实际上是想做一个滑动一个VP这的啊。行,那这个我们就搞定,然后运行一下。
12:12
嗯,好,过来以后呢,这是我们往下滑哎,往上滑哎,这个都可以,然后以及呢,我们这个图片哈,就是你在图片这个位置的话,我们往下。哎,这个往上。哎,往上,哎,这都没有问题哈,哎,这个下来呢,大家可以测试一下,刚才呢,我们这个就解决了两个问题。
我来说两句