基于Android屏幕上的触摸位置在自定义视图上旋转位图时出现问题

基于Android屏幕上的触摸位置在自定义视图上旋转位图时出现问题,android,matrix,android-custom-view,ontouchlistener,rotatetransform,Android,Matrix,Android Custom View,Ontouchlistener,Rotatetransform,我在实现此模式时遇到问题。我有一个自定义视图,上面画了一个图像。用户可以获取图像的一角并将其拖动,从而导致图像旋转 为了实现这一结果,我采取了以下措施: 位图存储在同样具有角度、x、y、centerX和centerY属性的对象中 @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_

我在实现此模式时遇到问题。我有一个自定义视图,上面画了一个图像。用户可以获取图像的一角并将其拖动,从而导致图像旋转

为了实现这一结果,我采取了以下措施: 位图存储在同样具有角度、x、y、centerX和centerY属性的对象中

@Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_MOVE:
                int currentX = (int) event.getX();
                int currentY = (int) event.getY();

               double rotationAngleRadians = Math.atan2(currentX - image.getCenterX(), image.getCenterY() - currentY);
               int rotationAngleDegrees = (int) Math.toDegrees(rotationAngleRadians);
               rotateMatrix.setRotate(rotationAngleDegrees , image.getCenterX(), image.getCenterX());
         .....
}
然后在onDraw中,我使用矩阵旋转画布

@Override
protected void onDraw(Canvas canvas) {
    canvas.save(Canvas.MATRIX_SAVE_FLAG);
    canvas.setMatrix(rotateMatrix);

   canvas.drawBitmap(image.getBitmap, image.getX(), image.getY(), imagePaint);
   canvas.restore();
}

这种方法的问题如下:当用户开始拖动按钮时,整个图像“跳上”25个像素,然后开始旋转。如何解决此问题?

当您向画布提供矩阵时,画布可能会忽略其先前矩阵中定义的先前转换


更干净的方法是只使用
canvas.rotate(…)
方法,而不是使用矩阵。如果必须使用矩阵类,请确保它基于原始的
canvas.getMatrix()

我需要使用矩阵,因为每个图像都有自己的旋转角度。我想这可以通过简单的canvas.rotate来完成,但是我还需要平移按钮x,y,这样我就可以检测未来的按下,为此我需要矩阵对象。更不用说,最终它将有多个图像,每个图像都有自己的矩阵。对于每个图像,您仍然可以在canvas.save和canvas.restore调用之间使用canvas.rotate和canvas.translate方法。它将使您的代码使用起来更加舒适。但是,如果你坚持使用矩阵,那么在你给画布一个新的矩阵之前,你需要确保你考虑了画布的现有矩阵。让我先给你一个巨大的感谢你打开了我的眼睛。我的印象是,
onDraw
canvas无法
mapPoints
。因此,在放弃单个
矩阵
方法并使用视图的
画布
旋转和
贴图点
后,一切都按预期进行,更不用说修复了我打开的另一个问题。谢谢你让我免于2-3天的研究和浪费时间。增加了一点+50奖金来奖励你的答案。你使我免于很多压力。我非常感激。再一次,很高兴我能帮忙:)