我正在尝试对表面视图中画布上绘制的旋转图像对象进行点击测试。 当图像不旋转时,我们可以直接使用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),但我希望它是图像对象的中心。
答案 0 :(得分:1)
您需要以数学方式使用它。最好的方法是在旋转画布之前按宽度/ 2,高度/ 2改变位置。然后应用旋转,最后按宽度/ 2,高度/ 2移回上一个位置。然后你的照片将始终从中心旋转。但仍然在旋转后,您的新图像将具有一个新尺寸,适合作为直线对齐屏幕边。
答案 1 :(得分:1)
正在研究类似的问题。就我而言,我想在接触点和旋转和缩放视图之间做一个最热门的事情。所以我根据视图的旋转变换触摸点坐标系,并检查它是否在非旋转视图边界内。
步骤
获取从event.getRawX()
和event.getRawY()
从
收到的屏幕位置中的目标视图位置 int location[] = new int[2];
view.getLocationOnScreen(location);
int viewX = location[0];
int viewY = location[1];
创建矢量,就像视图原点是空间原点
一样float[] vec = new float[2];
vec[0] = event.getRawX() - viewX;
vec[1] = event.getRawY() - viewY;
旋转矢量
Matrix matrix = new Matrix();
matrix.setRotate(-1 * view.getRotation());
matrix.mapVectors(vec);
将旋转的矢量更改为屏幕空间
vec[0] = vec[0] + viewX;
vec[1] = vec[1] + viewY;
检查旋转的触摸坐标是否在视图中未旋转的边界
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;
}