6

我正在尝试旋转此图像上的一个透明 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);
    }
}

由于矩阵参数,它还会在您触摸位图时调整其大小。这不是预期的效果。

用户几乎需要用手指转一圈。

4

3 回答 3

8

将以下代码写入您的触摸事件。

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;

并使用下面的链接以获得更多参考。

旋转拨号器示例

于 2012-07-10T05:03:30.247 回答
1

通过接受@Dipak Keshariya 的回答,我正在努力获得角度旋转,这可以帮助您识别车轮的选定部分。

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));
于 2014-04-09T06:49:39.053 回答
0

我想您想在用户触摸屏幕的位置旋转图像?如果是这样,请扩展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

于 2012-07-10T02:20:17.510 回答