2012-07-10 5 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

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

私はonLongPressではなくMotionEvent.ACTION_MOVEを使用していますが、その場でイメージの回転を変更しています。これは、回転アニメーションをタッチしたり、待機したりしているのと同じではありません。 – CQM

1

@Dipak Keshariya'sの答えを受け入れることで私はあなたが車輪の一部を選択し識別することができ、角度回転を取得するための方法を入れています。

関連する問題