最近研究了下 gpuimage的滤镜 , 在封装了滤镜控件后,对滤镜容器设置手势时出现了以下问题:
问题描述
主要问题就是GestureDetector onScroll
distance 数据抖动;
在用手势对象捕捉了dispatchTouchEvent事件后, 本打算 在 onScroll
方法中对容器view进行滑动的变化, 第一时间想到使用 translateX和translateY 属性对view进行滑动;
//sum 每次的移动距离;
mTranslateX += distanceX;
mTranslateY += distanceY;
//设置translate属性;
setTranslationX(mTranslateX);
setTranslationY(mTranslateY);
但是当使用setTranslationX()
方法设置属性后,滑动是能滑动,会出现抖动效果,通过打印得知distanceX 会出现两种,一会儿正,一会儿负,导致出现抖动; 用户体验效果很差;
问题原因
Left = x + translationX
理论上是没错的; 只可能的原因是设置了setTranslationX
方法后影响到了GestureDetector的onscroll 方法的distanceX
,出现正负交替出现;
查看方法注释为:
再看下GestureDetector的回调出onScroll方法的地方 onTouchEvent方法
重点看下MotionEvent.ACTION_MOVE 事件
当我长按时,控件出现不停的闪烁,只可能是进入最后一个判断方法了,这里变化的只有focusX这个关于焦点的变量; 难道是setTranslateX
改变了焦点,影响了多指触摸?? 但是我一直全程单指按住,画面一直闪烁,仿佛是两个点触摸一样; 看到这里没法解释了:(;
问题解决
后来 将setTranslate
方法改为setScrollX
方法,完美解决,通过移动内容,不改变位置属性为什么就不会抖动了呢,不得而知,欢迎看到的朋友踊跃解释一下;