【发布时间】:2017-04-16 16:24:12
【问题描述】:
我正在使用 canvas.drawPath 绘制一个复杂的形状。这些 drawPath 方法的结果就像一张比屏幕大的地图。我希望用户执行以下操作:用一根手指移动地图。或者用两根手指围绕屏幕中心旋转它。基本上它的行为应该与谷歌地图完全一样,只是没有缩放。到目前为止,我能够获得所需的运动和旋转:
private void handleTouch(MotionEvent event)
{
switch(event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
{
rotate=true;
move=false;
a=Math.toDegrees(-Math.atan2(event.getX(0)-event.getX(1),event.getY(0)-event.getY(1)));
if(a>360)a=a-360;
if(a<-360)a=a+360;
da=a-angle;
if(da>360)da=da-360;
if(da<-360)da=da+360;
}
break;
case MotionEvent.ACTION_POINTER_UP:
{
rotate=false;
move=false;
x = (int)event.getX();
y = (int)event.getY();
dx = x - translate.x;
dy = y - translate.y;
}
break;
case MotionEvent.ACTION_DOWN:
{
move=true;
x = (int)event.getX();
y = (int)event.getY();
dx = x - translate.x;
dy = y - translate.y;
}
break;
case MotionEvent.ACTION_MOVE:
{
if(rotate && event.getPointerCount()==2)
{
angle=Math.toDegrees((-Math.atan2(event.getX(0)-event.getX(1),event.getY(0)-event.getY(1))))-da;
if(angle>360)angle=angle-360;
if(angle<-360)angle=angle+360;
vmap.invalidate();
}
else if(move==true)
{
translate.set((int)event.getX() - dx,(int)event.getY() - dy);
//trans.setTranslate(translate.x,translate.y);
vmap.invalidate();
}
}
break;
case MotionEvent.ACTION_UP:
{
//your stuff
}
break;
}
问题在于正确地将它们应用在一起。如果我先平移然后围绕地图的中心坐标旋转,我可以轻松地围绕自己的中心旋转。但是,如果我尝试围绕屏幕中心旋转,事情就会变得复杂。假设我将画布向左移动 20 像素,然后将其旋转 30 度,然后向下移动 50 像素,然后再将其旋转 50 度。如果我尝试在第二次旋转期间将两个角度相加,我现在将围绕不同的坐标旋转,这意味着一旦我进行新的旋转,地图就会突然跳跃。
我研究过使用矩阵,但到目前为止没有帮助。
【问题讨论】: