我已经实现了这种行为,并且使用矩阵来处理所有缩放和滚动(以我为例)。它使代码更简洁,并且像发条一样工作。
将矩阵存储为类成员:
Matrix drawMatrix;
编辑:存储旧的焦点,用于在缩放期间获取焦点偏移。
float lastFocusX;
float lastFocusY;
编辑 :在onScaleBegin中设置lastFocus变量
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
lastFocusX = detector.getFocusX();
lastFocusY = detector.getFocusY();
return true;
}
替换您的onScale:
@Override
public boolean onScale(ScaleGestureDetector detector) {
Matrix transformationMatrix = new Matrix();
float focusX = detector.getFocusX();
float focusY = detector.getFocusY();
//Zoom focus is where the fingers are centered,
transformationMatrix.postTranslate(-focusX, -focusY);
transformationMatrix.postScale(detector.getScaleFactor(), detector.getScaleFactor());
/* Adding focus shift to allow for scrolling with two pointers down. Remove it to skip this functionality. This could be done in fewer lines, but for clarity I do it this way here */
//Edited after comment by chochim
float focusShiftX = focusX - lastFocusX;
float focusShiftY = focusY - lastFocusY;
transformationMatrix.postTranslate(focusX + focusShiftX, focusY + focusShiftY);
drawMatrix.postConcat(transformationMatrix);
lastFocusX = focusX;
lastFocusY = focusY;
invalidate();
return true;
}
同样在onScroll中:
@Override
public boolean onScroll(MotionEvent downEvent, MotionEvent currentEvent,
float distanceX, float distanceY) {
drawMatrix.postTranslate(-distanceX, -distanceY);
invalidate();
return true;
}
在onDraw;用您的drawMatrix绘制:
canvas.drawBitmap(image, drawMatrix, paint);
编码愉快!
0
我正在尝试使用Android的手势侦听器和缩放侦听器来实现捏缩放和拖动。问题是,当我执行捏缩放时,图像(我正在尝试缩放)会反弹到特定位置。变焦位置也没有居中。以下代码演示了我要实现的目标。知道为什么图像跳动(以及如何校正)吗?
提前致谢。