studio - Girar una vista en Android
que es vista en android (9)
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?
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 restoring to original direction.
rotate.setFillAfter(true);
someButton.startAnimation(rotate);
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,<appropriate x pivot value>,<appropriate y pivot value>);
super.onDraw(canvas);
canvas.restore();
}
La API 11 agregó un método setRotation() a todas las vistas.
La respuesta de @Ichorus es correcta para las vistas, pero si desea dibujar rectángulos o texto rotados, puede hacer lo siguiente en su devolución de llamada 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.restore();
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ó:
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);
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)
Una línea en XML
<View
android:rotation="45"
... />