web-dev-qa-db-fra.com

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 obtenir que cela fonctionne.

Quelqu'un peut-il s'il vous plaît fournir le code pour y parvenir?

65
Matthew

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

66
Jens Zalzala

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);
58
Pete

É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();

} 
46
Ichorus

Je viens d'utiliser la simple ligne dans mon code et cela fonctionne:

myCusstomView.setRotation(45);

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

26
Rudi

ne ligne en XML


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

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);
19
DYS

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)

6
Michael S

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:

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

enter image description here

6
Dmitry Ryadnenko

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();
1
gauravjain0102