本文主要是介绍ScaleGestureDetector 在两指距离较短时,不能缩放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
来源
ScaleGestureDetector 在两指距离较短时,不能缩放
一、问题分析
调试了发现,当手指距离很短的时候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。但这样并不现实,所以这里用反射的方法:
ScaleGestureDetector 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();
}
这样就可以啦。
这篇关于ScaleGestureDetector 在两指距离较短时,不能缩放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!