Android,帮助在触摸时旋转图像
Posted
技术标签:
【中文标题】Android,帮助在触摸时旋转图像【英文标题】:Android, help rotating image on touch 【发布时间】:2012-07-09 11:11:24 【问题描述】:我正在尝试旋转此图像上的一个透明 PNG。数字部分是我想要旋转的。我能够做到这一点,但这不是我想要实现的目标
我想像真正的密码锁一样旋转数字。所以用户将触摸并在一个圆圈中移动他们的手指。我查看了触摸/移动事件上不太精确的图像旋转,但它们还不够。
这是我目前的代码
public boolean onTouch(View v, MotionEvent event)
double r=Math.atan2(event.getX()-lockNumbers.getWidth(), lockNumbers.getHeight()-event.getY());
int rotation=(int)Math.toDegrees(r);
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
x=event.getX();
y=event.getY();
updateRotation(rotation);
break;
case MotionEvent.ACTION_UP:
break;
//switch
return true;
//onTouch
private void updateRotation(double rot)
float newRot=new Float(rot);
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.numbers);
Matrix matrix=new Matrix();
matrix.postRotate(newRot,bitmap.getWidth(),bitmap.getHeight());
if(y>250)
Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
lockNumbers.setImageBitmap(reDrawnBitmap);
else
Bitmap reDrawnBitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
lockNumbers.setImageBitmap(reDrawnBitmap);
当你触摸它时,它也会调整位图的大小,因为矩阵参数。这不是我们想要的效果。
用户几乎需要用手指转一圈。
【问题讨论】:
【参考方案1】:将以下代码写入您的触摸事件中。
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
// reset the touched quadrants
for (int i = 0; i < quadrantTouched.length; i++)
quadrantTouched[i] = false;
allowRotating = false;
startAngle = getAngle(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
double currentAngle = getAngle(event.getX(), event.getY());
rotateDialer((float) (startAngle - currentAngle));
startAngle = currentAngle;
break;
case MotionEvent.ACTION_UP:
allowRotating = true;
break;
// set the touched quadrant to true
quadrantTouched[getQuadrant(event.getX() - (dialerWidth / 2), dialerHeight - event.getY() - (dialerHeight / 2))] = true;
detector.onTouchEvent(event);
return true;
并使用下面的链接以获得更多参考。
Rotate Dialer Example
【讨论】:
我怎样才能检测到 ACTION_UP 事件执行了多少轮换?【参考方案2】:通过接受@Dipak Keshariya's 的回答,我正在努力获得角度旋转,这可以帮助您识别车轮的选定部分。
private float copy[] = new float[9];
matrix.getValues(copy);
float wheelAngle = Math.round(Math.atan2(copy[Matrix.MSKEW_X],
copy[Matrix.MSCALE_X]) * (180 / Math.PI));
【讨论】:
【参考方案3】:我想您想在用户触摸屏幕的位置旋转图像?如果是这样,扩展 SimpleOnGestureListener
像这个例子:
public class MyGestureDetector extends SimpleOnGestureListener
@Override
public void onLongPress(MotionEvent event)
int X = (int)event.getX();
int Y = (int)event.getY();
...Rotate the image
一旦您获得了触摸事件的屏幕坐标,您就可以应用关于该点的旋转动画 - 请参阅此处了解更多详细信息:http://developer.android.com/guide/topics/graphics/2d-graphics.html
【讨论】:
不完全是,我正在使用 MotionEvent.ACTION_MOVE ,而不是 onLongPress,然后动态更改图像旋转。这与触摸、等待然后执行旋转动画不同。以上是关于Android,帮助在触摸时旋转图像的主要内容,如果未能解决你的问题,请参考以下文章