2012-07-10 89 views
6

我想旋转此图像上的透明PNG之一。数字部分就是我想旋转的东西。我能做到这一点,但它不是我所试图实现Android,帮助旋转图像

http://i48.tinypic.com/25exzle.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); 
    } 
} 

也调整大小,当你触摸它,因为矩阵参数的位图。这不是预期的效果。

用户几乎需要用手指绕圈。

回答

6

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

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

+0

我该如何检测ACTION_UP事件执行了多少次旋转? – IronBlossom 2012-08-04 12:05:36

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

+0

不是很好,我使用MotionEvent.ACTION_MOVE,而不是onLongPress,然后在飞行中更改图像旋转。这不像触摸,等待,然后做一个旋转动画。 – CQM 2012-07-10 02:40:58

1

通过接受@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));