J'ai un bouton que je veux mettre sur un angle de 45 degrés. Pour une raison quelconque, je ne peux pas obtenir que cela fonctionne.
Quelqu'un peut-il s'il vous plaît fournir le code pour y parvenir?
L'API 11 a ajouté une méthode setRotation () à toutes les vues.
Vous pouvez créer une animation et l'appliquer à votre vue de 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 substituez la méthode onDraw()
. Assurez-vous que la vue parent est suffisamment grande pour gérer le bouton pivoté sans le découper.
@Override
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.rotate(45,<appropriate x pivot value>,<appropriate y pivot value>);
super.onDraw(canvas);
canvas.restore();
}
Je viens d'utiliser la simple ligne dans mon code et cela fonctionne:
myCusstomView.setRotation(45);
J'espère que ça marche pour toi.
ne ligne en XML
<View
Android:rotation="45"
... />
L'application d'une animation de rotation (sans durée, donc aucun 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);
Joininig @ Rudi's et les réponses de @ Pete. J'ai créé un RotateAnimation qui conserve la fonctionnalité des boutons même 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)
Faire pivoter la vue avec rotate()
n'affectera pas la taille mesurée de votre vue. En conséquence, la vue pivotée peut être découpée ou ne pas correspondre à la présentation parent. Cette bibliothèque le répare cependant:
La réponse de @ Ichorus est correcte pour les vues, mais si vous souhaitez dessiner des rectangles ou du texte pivotés, vous pouvez procéder comme suit dans votre rappel onDraw (ou onDispatchDraw) pour votre vue:
(notez que thêta est l'angle par rapport à l'axe x de la rotation souhaitée, pivot est le point qui représente le point autour duquel nous voulons faire pivoter le rectangle et horizontalRect est la position du rect "avant" la rotation)
canvas.save();
canvas.rotate(theta, pivot.x, pivot.y);
canvas.drawRect(horizontalRect, Paint);
canvas.restore();