今天測試反饋縮放時,卡頓,沒有縮放。
一、問題分析
調試了發現,當手指距離很短的時候detector.getScaleFactor() 等於 1,基本不動,那肯定不會縮放了。
沒辦法只能去到 ScaleGestureDetector 的源碼,發現如果要回調 onScale(ScaleGestureDetector detector) ,則它的條件如下:
if (action == MotionEvent.ACTION_MOVE) {
....
if (mInProgress) {
updatePrev = mListener.onScale(this);
}
首先,mInProgress 第一次賦值在 onScaleBegin() 方法中,這也是爲什麼要返回true 的原因。
mInProgress = mListener.onScaleBegin(this);
接着找到 mInProgress 被賦值爲 false 的地方,比如:
if (!inAnchoredScaleMode() && mInProgress && (span < mMinSpan || configChanged)) {
mListener.onScaleEnd(this);
mInProgress = false;
mInitialSpan = span;
}
可以發現,罪魁禍首是 mMinSpan 這個參數,它的數值如下:
mMinSpan = res.getDimensionPixelSize(com.android.internal.R.dimen.config_minScalingSpan);
這個可以在 framework 的 res 中找到值,不同版本值不同。
二、解決方法
如果你能源碼開發,直接改這個值即可。但這個對一般人來說都比較麻煩,但咱們可以複製 ScaleGestureDetector 這個類的源碼,直接複製 mMinSpan。但這樣並不現實,所以這裏用反射的方法:
mScaleGesture = new ScaleGestureDetector(context, new ScaleListener());
//設置 mMinSpan ,防止不能縮小
try {
Field field = mScaleGesture.getClass().getDeclaredField("mMinSpan");
field.setAccessible(true);
field.set(mScaleGesture,1);
} catch (Exception e) {
e.printStackTrace();
}
這樣就可以啦。