web-dev-qa-db-ja.com

Androidでビューを回転させる

45度の角度に配置したいボタンがあります。何らかの理由で、これを機能させることができません。

誰かがこれを達成するためにコードを提供してもらえますか?

65
Matthew

API 11は、すべてのビューに setRotation() メソッドを追加しました。

66
Jens Zalzala

アニメーションを作成して、ボタンビューに適用できます。例えば:

    // Locate view
    ImageView diskView = (ImageView) findViewById(R.id.imageView3);

    // Create an animation instance
    Animation an = new RotateAnimation(0.0f, 360.0f, pivotX, pivotY);

    // Set the animation's parameters
    an.setDuration(10000);               // duration in ms
    an.setRepeatCount(0);                // -1 = infinite repeated
    an.setRepeatMode(Animation.REVERSE); // reverses each repeat
    an.setFillAfter(true);               // keep rotation after animation

    // Aply animation to image view
    diskView.setAnimation(an);
58
Pete

TextViewクラスを拡張し、onDraw()メソッドをオーバーライドします。親ビューが、クリップせずに回転したボタンを処理するのに十分な大きさであることを確認してください。

@Override
protected void onDraw(Canvas canvas) {
     canvas.save();
     canvas.rotate(45,<appropriate x pivot value>,<appropriate y pivot value>);
     super.onDraw(canvas);
     canvas.restore();

} 
46
Ichorus

私はコードで単純な行を使用しましたが、それは動作します:

myCusstomView.setRotation(45);

それがあなたのために働くことを願っています。

26
Rudi

XMLの1行


<View
    Android:rotation="45"
    ... />
20
Michael

View.setRotation()を呼び出すか、View.onDrawメソッドをオーバーライドするよりも簡単な解決策は、回転アニメーションを適用することです(継続時間なしでアニメーション効果はありません)。

// substitude deltaDegrees for whatever you want
RotateAnimation rotate = new RotateAnimation(0f, deltaDegrees, 
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);  

// prevents View from restoring to original direction. 
rotate.setFillAfter(true); 

someButton.startAnimation(rotate);
19
DYS

Joininig @Rudiおよび@Peteの回答。回転後もボタンの機能を保持するRotateAnimationを作成しました。

setRotation()メソッドはボタンの機能を保持します。

コードサンプル:

Animation an = new RotateAnimation(0.0f, 180.0f, mainLayout.getWidth()/2, mainLayout.getHeight()/2);

    an.setDuration(1000);              
    an.setRepeatCount(0);                     
    an.setFillAfter(false);              // DO NOT keep rotation after animation
    an.setFillEnabled(true);             // Make smooth ending of Animation
    an.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {}

        @Override
        public void onAnimationRepeat(Animation animation) {}

        @Override
        public void onAnimationEnd(Animation animation) {
                mainLayout.setRotation(180.0f);      // Make instant rotation when Animation is finished
            }
            }); 

mainLayout.startAnimation(an);

mainLayoutは(LinearLayout)フィールドです

6
Michael S

rotate()でビューを回転しても、ビューの測定サイズには影響しません。その結果、回転したビューはクリップされるか、親レイアウトに収まりません。このライブラリはそれを修正します:

https://github.com/rongi/rotate-layout

enter image description here

6

@Ichorusの答えはビューに対しては正しいですが、回転した長方形またはテキストを描画したい場合は、ビューのonDraw(またはonDispatchDraw)コールバックで次のことができます。

(シータは目的の回転のx軸からの角度であり、ピボットは長方形を回転させたいポイントを表すPointであり、horizo​​ntalRectは回転する前のrectの位置です)

canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, Paint);
canvas.restore();
1
gauravjain0102