Android 在缩放画布上绘制图像
我试图在缩放画布上绘制一幅图像,用户触摸了屏幕,但它绘制的图像比例不正确。 我正在使用自定义缩放侦听器根据建议缩放画布: 和SimpleNogestureListener滚动并绘制图像Android 在缩放画布上绘制图像,android,android-canvas,scale,pinchzoom,Android,Android Canvas,Scale,Pinchzoom,我试图在缩放画布上绘制一幅图像,用户触摸了屏幕,但它绘制的图像比例不正确。 我正在使用自定义缩放侦听器根据建议缩放画布: 和SimpleNogestureListener滚动并绘制图像 public class ScrollListener extends GestureDetector.SimpleOnGestureListener{ @Override public boolean onSingleTapConfirmed(MotionEvent e) { r
public class ScrollListener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return true;
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
Toast.makeText(context, "onSingleTapUp", Toast.LENGTH_SHORT).show();
playersCanvas.drawBitmap(playerBitmap, touchX, touchY, canvasPaint);
invalidate();
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
backgroundMatrix.postTranslate(-distanceX, -distanceY);
invalidate();
return true;
}
}
这是我的OnDraw:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(background, backgroundMatrix, canvasPaint);
canvas.drawBitmap(playersBitmap, backgroundMatrix, canvasPaint);
}
现在,当我触摸屏幕时,图像确实会绘制到画布上,但不会绘制到我触摸的位置,也不会绘制到正确的比例。
例如:
这是最初的背景:
缩放和滚动后,我触摸了屏幕上红色圆圈的位置(添加在后面),图像绘制在右下角
缩小到原始大小后,您可以在画布上看到错误的位置:
我发现线程假设我有缩放点,但由于“自由”缩放和滚动选项,我没有
如何用正确的比例在正确的位置绘制图像?通过@pskink的提示找到了答案。现在OnSingleTapp看起来像这样:
@Override
public boolean onSingleTapUp(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
float[] points = new float[2];
points[0] = touchX;
points[1] = touchY;
Matrix inverse = new Matrix();
backgroundMatrix.invert(inverse);
inverse.mapPoints(points);
Bitmap scaledPlayer = Bitmap.createBitmap(playerBitmap, 0, 0, playerBitmap.getWidth(), playerBitmap.getHeight(), inverse, true);
playersCanvas.drawBitmap(scaledPlayer, points[0], points[1], canvasPaint);
invalidate();
return true;
}
使用
Matrix.mapPoints()
谢谢!!这个暗示使我找到了答案。。
@Override
public boolean onSingleTapUp(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
float[] points = new float[2];
points[0] = touchX;
points[1] = touchY;
Matrix inverse = new Matrix();
backgroundMatrix.invert(inverse);
inverse.mapPoints(points);
Bitmap scaledPlayer = Bitmap.createBitmap(playerBitmap, 0, 0, playerBitmap.getWidth(), playerBitmap.getHeight(), inverse, true);
playersCanvas.drawBitmap(scaledPlayer, points[0], points[1], canvasPaint);
invalidate();
return true;
}