45度の角度に配置したいボタンがあります。何らかの理由で、これを機能させることができません。
誰かがこれを達成するためにコードを提供してもらえますか?
API 11は、すべてのビューに setRotation() メソッドを追加しました。
アニメーションを作成して、ボタンビューに適用できます。例えば:
// 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);
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();
}
私はコードで単純な行を使用しましたが、それは動作します:
myCusstomView.setRotation(45);
それがあなたのために働くことを願っています。
XMLの1行
<View
Android:rotation="45"
... />
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);
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)フィールドです
rotate()
でビューを回転しても、ビューの測定サイズには影響しません。その結果、回転したビューはクリップされるか、親レイアウトに収まりません。このライブラリはそれを修正します:
@Ichorusの答えはビューに対しては正しいですが、回転した長方形またはテキストを描画したい場合は、ビューのonDraw(またはonDispatchDraw)コールバックで次のことができます。
(シータは目的の回転のx軸からの角度であり、ピボットは長方形を回転させたいポイントを表すPointであり、horizontalRectは回転する前のrectの位置です)
canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, Paint);
canvas.restore();