【问题标题】:How to do hit test on a rotated image in Android?如何在 Android 中对旋转图像进行命中测试?
【发布时间】:2011-11-30 11:13:18
【问题描述】:

我正在尝试对在表面视图的画布上绘制的旋转图像对象进行命中测试。 当图像不旋转时,我们可以直接使用 left、top、width 和 height 作为边界来检查该点是否在图像矩形内。但是当物体旋转到某个角度时怎么办呢?

我正在使用:canvas.rotate(angle, pivotX ,pivotY); 来绘制旋转后的图像。

我无法获得图像对象的旋转左侧和顶部。我试图在图像的左侧和顶部拍摄原始图像,当我点击屏幕时,我使用相同的角度将触摸点旋转回来:

angledTouchX = (float) (eventX * Math.cos(-objectAngle) - eventY * Math.sin(-objectAngle));
angledTouchY  = (float) (eventY * Math.sin(-objectAngle) + eventX * Math.cos(-objectAngle));

它不起作用,因为它旋转点 wrt (0,0),但我希望它 wrt 图像对象的中心。

【问题讨论】:

    标签: android canvas drawing rotation angle


    【解决方案1】:

    正在解决类似的问题。就我而言,我想在接触点和旋转和缩放视图之间做一个最热门的。所以我根据视图的旋转变换触摸点坐标系,并检查它是否在非旋转视图边界内。

    步骤

    1. 获取从event.getRawX()event.getRawY()接收的屏幕坐标系中的触摸点

    2. 接收到的屏幕位置中的目标视图位置
       int location[] = new int[2];
       view.getLocationOnScreen(location);
       int viewX = location[0];
       int viewY = location[1];
      
    3. 创建向量,就像视图原点是空间原点一样

      float[] vec = new float[2];
      vec[0] = event.getRawX() - viewX;
      vec[1] = event.getRawY() - viewY;
      
    4. 旋转矢量

      Matrix matrix = new Matrix();
      matrix.setRotate(-1 * view.getRotation());
      matrix.mapVectors(vec);
      
    5. 将旋转矢量更改为屏幕空间

      vec[0] = vec[0] + viewX;
      vec[1] = vec[1] + viewY;
      
    6. 检查旋转的触摸坐标是否在视图未旋转的边界内

      if(( vec[0] > viewX 
          && vec[0] < (viewX + (view.getWidth() * view.getScaleX()) )) 
          &&( vec[1] > viewY 
          && vec[1] < (viewY + (view.getHeight() * view.getScaleY()) ))){
              isPointInTextView = true;
      } else {
              isPointInTextView = false;
      }
      

    【讨论】:

      【解决方案2】:

      您需要在数学上使用它。最好的方法是在旋转画布之前将位置更改宽度/2、高度/2。然后应用旋转,最后按宽度/2,高度/2 移回之前的位置。然后您的图片将始终从中心旋转。但是在旋转后,您的新图像仍然会有一个新的尺寸,它适合作为与屏幕侧面对齐的矩形。

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多