Estoy creando una aplicación, con recursos que se pueden reutilizar (porque los botones son siempre los mismos, pero reflejados o rotados). Quiero usar el mismo recurso para no tener que agregar 3 recursos más que son exactamente como el original pero rotados. Pero tampoco quiero mezclar el código con cosas que se pueden declarar en el XML o hacer transformaciones con una matriz que costará tiempo de procesamiento.
Tengo un botón de dos estados declarado en un XML.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/and_card_details_button_down_left_onclick" /> <!-- pressed -->
<item android:drawable="@drawable/and_card_details_button_down_left" /> <!-- default -->
</selector>
y quiero reutilizar el dibujable porque será el mismo pero girado 90º y 45º y le asigno al botón como dibujable.
<Button android:id="@+id/Details_Buttons_Top_Left_Button"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/details_menu_large_button" />
Sé que puedo rotarlo con a RotateDrawable
o con a, Matrix
pero como ya expliqué, no me gusta ese enfoque.
¿Es posible lograrlo directamente en XML o cuál crees que será la mejor manera de hacerlo? ¿Poner todos los recursos pero rotados, rotarlos en el código?
--- EDITAR --- La respuesta de @dmaxi funciona muy bien, así es como se combina con una lista de elementos :)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/and_card_details_button_up_onclick"/>
</item>
<item>
<rotate
android:fromDegrees="90"
android:toDegrees="90"
android:pivotX="50%"
android:pivotY="50%"
android:drawable="@drawable/and_card_details_button_up_onclick"/>
</item>
</selector>
fuente
Respuestas:
Podría rotar en XML:
El
fromDegrees
es importante.Básicamente, se trata de una animación de rotación definida en XML. Con
fromDegrees
usted define el estado inicial girado. EltoDegrees
es un estado de giro final del dibujable en la secuencia de animación, pero puede ser cualquier cosa si usted no desea utilizar la animación.No creo que asigne recursos para la animación, ya que no tiene que cargarse como animación. Como dibujable, se representa como su estado inicial y debe colocarse en la
drawable
carpeta de recursos. Para usarlo como una animación, debe ponerlo enanim
la carpeta de recursos y puede iniciar la animación de esta manera (solo un ejemplo):fuente
Podría rotar la flecha izquierda hacia la derecha en XML como:
Imagen adjunta para referencia.
fuente
Si se utilizan elementos de diseño basados en vectores, junto con una lista de estado de ImageView , estilo y color, su botón se puede refactorizar de la siguiente manera:
Nota: los elementos de diseño vectoriales son significativamente más pequeños que las imágenes, por lo que las definiciones adicionales y explícitas no implican mucha sobrecarga y generan un código claro y explícito (aunque he leído que se debe evitar la modificación manual de los elementos vectoriales, prefiero tratar con la sobrecarga de actualizar un par de archivos que tener transformaciones en uno):
Nota: Android Studio es una excelente fuente de recursos vectoriales.
res \ valores \ estilos.xml
res \ color \ button_csl.xml
details_menu_large_button.xml
Details_Buttons_Top_Left_Button
and_card_details_button_down_left.xml (ic_play_arrow_black_24dp.xml)
and_card_details_button_down_left_onclick.xml (ic_play_arrow_black_24dp.xml modificado)
fuente
rotationGroup
atributo, se gira el vector muy bienSi desea
rotation
Disponibles enxml
archivo y simple extensiónandroid:rotation="180"
deImageView
fuente