Cómo girar una vista en Android
Tengo un botón que quiero poner en un ángulo de 45 grados. Por alguna razón no puedo conseguir que esto funcione.
¿Puede alguien proporcionar el código para lograr esto?
- El tamaño de texto de Android en la lona difiere del tamaño de texto en TextView
- Vista de Android establecida en Visible y Gone en el mismo método OnClick, View nunca mostrando Visible
- Vista personalizada de Android onMease onDraw lifecycle
- Página Curl Animation en android?
- Obtenga de forma fiable la altura de la barra de estado para resolver problemas de navegación translúcida de KitKat
- ¿Es posible usar inflador de vista para inflar artículos individuales?
- View.setBackground lanza NoSuchMethodError
- Android Multiple SurfaceViews
- Iterar a través de vistas en un diseño y cambiar la tipografía
- ¿Cómo puedo recuperar el botón de trabajo cuando searchview en Android
- El niño especificado ya tiene un error de padre en la vista inflado
- Android: ¿Proporciona sugerencias de búsqueda recientes sin actividad de búsqueda?
- Android: Tutorial sobre la creación de vistas personalizadas
Podría 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);
API 11 agregó un método setRotation () a todas las vistas.
Amplíe la clase TextView
y anule el método onDraw()
. Asegúrese de que la vista de padre es lo suficientemente grande 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(); }
Acabo de usar la línea simple en mi código y funciona:
myCusstomView.setRotation(45);
Espero que funcione para ti.
La aplicación de una animación de rotación (sin duración, por lo tanto sin efecto de animación) es una solución más sencilla que llamar a View.setRotation () o sustituir 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);
Una línea en XML
<View android:rotation="45" ... />
Joininig @ Rudi y @ Pete respuestas. He creado una 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.
Ejemplo 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 rotativa con rotate()
no afectará al tamaño medido de la vista. Sólo se ve afectada la representación de la vista y, como resultado, la vista giratoria la hará recortar o no encajar en la disposición principal. Esta biblioteca lo arregla sin embargo:
@ La respuesta de Ichorus es correcta para las vistas, pero si desea dibujar rectángulos girados o texto, puede hacer lo siguiente en su devolución de llamada onDraw (o onDispatchDraw) para su vista:
(Nota que theta es el ángulo desde el eje x de la rotación deseada, pivote es el punto que representa el punto alrededor del cual queremos que el rectángulo gire, y horizontalRect es la posición del rect "antes" de que se girara)
canvas.save(); canvas.rotate(theta, pivot.x, pivot.y); canvas.drawRect(horizontalRect, paint); canvas.restore();