2012-04-22 9 views
2

アンドロイドのonTouch()イベントで時計回りと反時計回りの画像を回転させる方法を知りたいです。また、onTouchListenerを介して時計回りまたは反時計回りに回転を検出する方法はありますか?アンドロイドで時計回りと反時計回りに画像を回転する方法は?

public class CustomImageView extends View implements OnClickListener{ 
    ... 
} 

オーバーライドあなたCustomImageViewクラス内のonDrawメソッド:ありがとう

+0

使ったアニメーションを回転させ、そこに良い例がたくさんあり... http://developer.android.com/reference/android/view/animation/RotateAnimation.html – testingtester

+0

おかげで出ている、しかし、私はしたいですアンドロイドのonTouch()イベントで時計回りと反時計回りの画像を回転する方法を知ってください – secretlm

答えて

0

は、基本的には、ビューを拡張し、このようにOnClickListenerを実装する独自のクラス、内部のあなたのイメージを置いてもよいです。キャンバスオブジェクトを回転させることで、回転をonDrawの内部に実装することができます。

第3に、clickイベントを取得し、必要に応じてローテーションを実行するためにonClickを実装します。あなたはMotionEventオブジェクトからxとyの値から、あなたの回転を取得するには、この機能を使用しようとすることができ

public class CustomImageView extends View implements OnClickListener{ 

    public void onClick (View v){ 

     // process click here 

     // invalidate after click processing in order to redraw 
     this.invalidate(); 
    } 


    protected void onDraw(Canvas canvas) { 

     // draw your image here, might be bitmap or other stuff 

     // rotate canvas now, your logic on clockwise or 
     // counterclockwise rotation goes here 
     canvas.rotate(-90.0f, centerx, centery); 

    }   

} 
+0

ありがとうございます。実際には、Matrixクラスを使ってイメージを時計回りと反時計回りに回転させることができます。しかし、私はonTouch()イベントで時計回りと反時計回りの画像を回転させたいと思います。 – secretlm

+0

これはonClickと同じ構造です。タッチまたはクリックの処理後に再描画するだけです。 あなたのローテーションロジックは何ですか? 1回目のタッチで時計回りに回転し、2回目のタッチで反時計回りに回転するなどしますか?カウントアップするタッチカウンタ変数が必要な場合があります。そのため、画像がどの回転状態にあるかをonDrawで知ることができます。 – alex

0

基本的なレイアウトは次のように見えるかもしれません。 ここでも、与えられたベクトルxとベクトルyからの追加計算の方向を見つける必要があります。

private int calculateAngle(float GETX, float GETY) { 
    int direction = 1; 

    double tx = (int) GETX - object_center.x; 
    double ty = (int) GETY - object_center.y; 
    double angleInDegrees = Math.atan2(ty, tx) * 180/Math.PI; 
    int area = 0; 
    int ACTUAL_ANGLE = 270; 

    if (angleInDegrees < 0 && angleInDegrees < -90) { 
     // Need to add 
     // 270+angle degrees 
     // ================= 
     ACTUAL_ANGLE += (int) (180 + angleInDegrees) * direction; 
    } else if (angleInDegrees < 0 && angleInDegrees > -90) { 
     // Need to add 
     // 90+angle degrees 
     // ================= 
     ACTUAL_ANGLE = (int) (90 + angleInDegrees); 
    } else if (angleInDegrees > 0) 
     ACTUAL_ANGLE = 90 + (int) angleInDegrees; 
    return ACTUAL_ANGLE; 
} 
関連する問題