如何在Android中对旋转图像进行点击测试?

时间:2011-10-04 07:28:26

标签: android canvas drawing rotation angle

我正在尝试对表面视图中画布上绘制的旋转图像对象进行点击测试。 当图像不旋转时,我们可以直接使用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),但我希望它是图像对象的中心。

2 个答案:

答案 0 :(得分:1)

您需要以数学方式使用它。最好的方法是在旋转画布之前按宽度/ 2,高度/ 2改变位置。然后应用旋转,最后按宽度/ 2,高度/ 2移回上一个位置。然后你的照片将始终从中心旋转。但仍然在旋转后,您的新图像将具有一个新尺寸,适合作为直线对齐屏幕边。

答案 1 :(得分:1)

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

步骤

  1. 获取从event.getRawX()event.getRawY()

  2. 收到的屏幕坐标系统中的触摸点
  3. 收到的屏幕位置中的目标视图位置
     int location[] = new int[2];
     view.getLocationOnScreen(location);
     int viewX = location[0];
     int viewY = location[1];
    
  4. 创建矢量,就像视图原点是空间原点

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

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

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

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