Android 在缩放画布上绘制图像

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

我试图在缩放画布上绘制一幅图像,用户触摸了屏幕,但它绘制的图像比例不正确。 我正在使用自定义缩放侦听器根据建议缩放画布:

和SimpleNogestureListener滚动并绘制图像

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;
    }