Android中ScaleGestureDetector返回的ScaleFactor含义及取值范围
getScaleFactor() 返回值含义
该返回值是本次缩放回调和上一次缩放回调之间,两根触摸手指的间距比值,属于单次缩放的相对比例乘数,不是手势启动到当前时刻的累计总缩放比例:
- 数值大于1时:当前手指间距比上一次回调时更大,对应放大手势,你可以将自身维护的总缩放系数乘以该值,得到最新的总缩放倍数
- 数值小于1时:当前手指间距比上一次回调时更小,对应缩小手势,同样用总缩放系数乘以该值更新即可
举个实际计算示例:如果当前你维护的视图总缩放倍数是2倍,本次getScaleFactor()返回1.2,那么更新后的总缩放倍数就是 2 * 1.2 = 2.4 倍;如果本次返回0.8,更新后的总缩放倍数就是 2 * 0.8 = 1.6 倍。
ScaleFactor 的取值范围
安卓系统没有为该值设置固定的硬编码上下限,它的核心计算逻辑为 当前两指触摸间距 / 上一次回调时的两指触摸间距,系统会额外做平滑滤波处理避免数值跳变,实际运行中常见取值范围如下:
- 缩小时(捏合手势):常见取值范围为 0.7 ~ 1,不会出现无限趋近于0的极端值,系统会限制单次回调的缩小幅度,避免缩放突变
- 放大时(张开手势):常见取值范围为 1 ~ 1.4,同样不会出现单次数值过大的情况,避免缩放速度过快失控
如果需要限制整个缩放过程的总缩放范围,不要依赖单次ScaleFactor的上下限,建议你自行维护总缩放系数变量,每次计算后手动做边界拦截,参考实现代码如下:
public class MyScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener { // 自定义总缩放的最小、最大倍数 private static final float MIN_TOTAL_SCALE = 0.5f; private static final float MAX_TOTAL_SCALE = 3.0f; // 维护累计总缩放系数 private float totalScale = 1.0f; @Override public boolean onScale(ScaleGestureDetector scaleGestureDetector) { float scaleFactor = scaleGestureDetector.getScaleFactor(); totalScale *= scaleFactor; // 手动拦截总缩放边界 totalScale = Math.max(MIN_TOTAL_SCALE, Math.min(totalScale, MAX_TOTAL_SCALE)); Log.i(TAG,"单次缩放因子:" + scaleFactor + ",当前总缩放倍数:" + totalScale); // 此处使用totalScale对目标视图做缩放处理即可 return true; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { // 必须返回true才能接收后续的缩放事件 return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { // 缩放手势结束时的回调,可按需添加逻辑 } }
内容的提问来源于stack exchange,提问作者Akkuu
相关产品推荐
相关产品推荐

