Girar una vista en Android

Tengo un botón que quiero poner en un ángulo de 45 grados. Por alguna razón, no puedo hacer que esto funcione.

¿Puede alguien proporcionar el código para lograr esto?

La API 11 agregó un método setRotation () a todas las vistas.

Puede crear una animación y aplicarla a su vista de botón. Por ejemplo:

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

Extienda la clase TextView y anule el método onDraw() . Asegúrese de que la vista principal sea lo suficientemente grande como para manejar el botón girado sin recortarlo.

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

Acabo de usar la línea simple en mi código y funciona:

 myCusstomView.setRotation(45); 

Espero que funcione para ti.

Aplicar una animación de rotación (sin duración, por lo tanto sin efecto de animación) es una solución más simple que llamar a View.setRotation () o anular el método 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 restring to original direction. rotate.setFillAfter(true); someButton.startAnimation(rotate); 

Una línea en XML


  

Respuestas de Joininig @ Rudi y @ Pete. Creé un RotateAnimation que mantiene la funcionalidad de los botones también después de la rotación.

El método setRotation () preserva la funcionalidad de los botones.

Muestra de código:

 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 es un campo (LinearLayout)

La vista giratoria con rotate() no afectará el tamaño medido de su vista. Como resultado, la vista girada se recortará o no se ajustará al diseño principal. Esta biblioteca lo solucionó:

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

enter image description here

La respuesta de @Ichorus es correcta para las vistas, pero si desea dibujar rectangularjs o texto rotados, puede hacer lo siguiente en su callback onDraw (o onDispatchDraw) para su vista:

(nótese que theta es el ángulo desde el eje x de la rotación deseada, el pivote es el punto que representa el punto alrededor del cual queremos que gire el rectángulo, y horizontalRect es la posición del recto “antes” de rotar)

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