我使用了带有 ScaleGestureDectector 类的自定义视图。我的问题是当我放大 4.5 倍时,我的自定义布局无法缩小。
这是我的代码:
private class ScaleGestureListener
extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = mScaleFactor * detector.getScaleFactor();
mScaleFactor = scaleFactor;
setScaleX(getScaleX() * mScaleFactor);
setScaleY(getScaleY() * mScaleFactor);
invalidate();
return true;
}
这个问题有什么解决方案吗?我想将布局放大至少 4.5 倍
而不是:
float scaleFactor = mScaleFactor * detector.getScaleFactor();
这样做:
float scaleFactor = Math.max(4.5F, mScaleFactor * detector.getScaleFactor());
这可确保最小缩放比例因子为 4.5
编辑:我误解了你的问题。看起来您不应该跟踪mScaleFactor。API 为您完成繁重的工作。根据 API,getScaleFactor()
返回the scaling factor from the previous scale event to the current event.
因此,当您跟踪字段中的 mScaleFactor 时,会出现以下问题:
// With these two lines, you're multiplying the variable mScaleFactor.
// Suppose that it was 3, and we're zooming out by 0.66666666
// Now, mScaleFactor is 2.
float scaleFactor = mScaleFactor * detector.getScaleFactor();
mScaleFactor = scaleFactor;
// Here, you're multiplying scaleX and scaleY by mScaleFactor (by 2. This effectively zooms in)
// You should only be multiplying them by 0.666666666 (effectively zooming out).
setScaleX(getScaleX() * mScaleFactor);
setScaleY(getScaleY() * mScaleFactor);
invalidate();
return true;
所以你的身体应该简单这样:
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = detector.getScaleFactor();
setScaleX(getScaleX() * scaleFactor);
setScaleY(getScaleY() * scaleFactor);
invalidate();
return true;
}