最近研究了下 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
方法,完美解決,通過移動內容,不改變位置屬性爲什麼就不會抖動了呢,不得而知,歡迎看到的朋友踊躍解釋一下;