2012-07-10 97 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));