Faire pivoter une vue dans Android

J’ai un bouton que je veux mettre sur un angle de 45 degrés. Pour une raison quelconque, je ne peux pas faire fonctionner cela.

Quelqu’un peut-il s’il vous plaît fournir le code pour accomplir cela?

API 11 a ajouté une méthode setRotation () à toutes les vues.

Vous pouvez créer une animation et l’appliquer à votre vue bouton. Par exemple:

// 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); 

Étendez la classe TextView et remplacez la méthode onDraw() . Assurez-vous que la vue parent est suffisamment grande pour gérer le bouton pivoté sans le couper.

 @Override protected void onDraw(Canvas canvas) { canvas.save(); canvas.rotate(45,,); super.onDraw(canvas); canvas.restore(); } 

Je viens d’utiliser la ligne simple dans mon code et ça marche:

 myCusstomView.setRotation(45); 

J’espère que ça marche pour toi.

Appliquer une animation de rotation (sans durée, donc sans effet d’animation) est une solution plus simple que d’appeler View.setRotation () ou de remplacer la méthode 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); 

Une ligne en XML


  

Les réponses de Joininig @ Rudi et @ Pete. J’ai créé un RotateAnimation qui conserve la fonctionnalité des boutons après la rotation.

La méthode setRotation () préserve la fonctionnalité des boutons.

Exemple de code:

 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 est un champ (LinearLayout)

La rotation de la vue avec rotate() n’affecte pas la taille mesurée de votre vue. En conséquence, la vue pivotée est tronquée ou ne rentre pas dans la mise en page parente. Cette bibliothèque résout cependant le problème:

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

entrer la description de l'image ici

La réponse de @ Ichorus est correcte pour les vues, mais si vous souhaitez dessiner des rectangles ou du texte pivotés, vous pouvez effectuer les opérations suivantes dans votre rappel onDraw (ou onDispatchDraw):

(notez que thêta est l’angle de l’axe x de la rotation désirée, pivot est le point qui représente le point autour duquel nous voulons que le rectangle tourne, et horizontalRect est la position du rect “avant” qu’il ait été pivoté)

 canvas.save(); canvas.rotate(theta, pivot.x, pivot.y); canvas.drawRect(horizontalRect, paint); canvas.restore();