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,帮助在触摸时旋转图像的主要内容,如果未能解决你的问题,请参考以下文章

Android:通过拖动图像的特定部分来旋转图像

试图在android中旋转布局,画布似乎不会旋转

在Android中的旋转木马

android控件随手势旋转

从相机/图库加载图像位图时会旋转 [Android 9]

在 Android Eclipse 中旋转图像时出错