【问题标题】:Issue with rotating a bitmap on custom view based on touch position on the screen on Android基于 Android 屏幕上的触摸位置在自定义视图上旋转位图的问题
【发布时间】:2014-07-08 11:10:25
【问题描述】:

我在实现此模式时遇到问题。我有一个自定义视图,上面绘制了图像。用户可以选取图像的一角并拖动它,这会导致图像旋转。

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

【问题讨论】:

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


    【解决方案1】:

    当你给画布你的矩阵时,画布可能会忽略在其先前矩阵中定义的先前翻译。

    更简洁的方法是只使用canvas.rotate(...) 方法,而不是使用矩阵。如果你必须使用矩阵类,那么请确保你基于原来的canvas.getMatrix()

    【讨论】:

    • 我需要使用矩阵,因为每个图像都有自己的旋转角度。我想这可以用简单的 canvas.rotate 来完成,但是我还需要翻译按钮 x,y 以便我可以检测到未来的按下,为此我需要 Matrix 对象。更不用说最终它会有多个图像,每个图像都有自己的矩阵。
    • 您仍然可以在每个图像的 canvas.save 和 canvas.restore 调用之间使用 canvas.rotate 和 canvas.translate 方法。这将使您的代码使用起来更加舒适。不过,如果你坚持使用矩阵,那么你需要确保在给它一个新矩阵之前考虑到画布的现有矩阵。
    • 首先让我给你一个GIGANTIC,谢谢你让我大开眼界。我的印象是onDraw 画布不能mapPoints。因此,在放弃单独的Matrix 方法并使用视图的canvas 进行旋转和mapPoints 之后,一切都按预期工作,更不用说这解决了我打开的其他问题之一。感谢您将我从另外 2-3 天的研究和时间浪费中解救出来。
    • 添加了一个小的 +50 赏金来奖励您的回答。你让我摆脱了很多压力。
    • 我非常感激。再一次,很高兴我能帮忙:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多