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

时间:2014-07-08 11:10:25

标签: android matrix android-custom-view ontouchlistener rotatetransform

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

enter image description here

为了达到这个结果,我做了以下事情: 位图存储在一个对象中,该对象也具有angle,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像素,然后开始旋转。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

当您为画布提供矩阵时,画布可能会忽略之前在其前一个矩阵中定义的翻译。

更简洁的方法是使用canvas.rotate(...)方法,而不是使用矩阵。如果您必须使用矩阵类,请确保将其基于原始canvas.getMatrix()