¿Es posible rotar un elemento de diseño en la descripción xml?


Estoy creando una aplicación, con recursos que se pueden reutilizar (porque los botones son siempre los mismos, pero duplicados o girados). Quiero usar el mismo recurso para no tener que agregar 3 recursos más que sean exactamente como el original, pero girados. 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 la reutilización de la imagen, porque será el mismo, pero se gira 90º y a 45º y me asignar al botón como un 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 un RotateDrawable o con una Matrix pero como ya he explicado no me gusta ese enfoque.

Es posible lograr que directamente en el 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 genial, así es como combinarlo con una lista de artículos:)

<?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>
Author: ROMANIA_engineer, 2012-01-03

3 answers

Podría rotar en XML:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%"
        android:drawable="@drawable/mainmenu_background">
</rotate>

El fromDegrees es importante.

Básicamente se trata de una animación rotativa definida en XML. Con fromDegrees se define el estado inicial de rotación. El toDegrees es el estado de rotación final del elemento de diseño en la secuencia de animación, pero puede ser cualquier cosa si no desea usar animación.

No creo que asigne recursos para la animación, ya que no tiene que cargarse como animación. Como un elemento de diseño se representa como su estado inicial y debe colocarse en la carpeta de recursos drawable. Para usarlo como una animación debe ponerlo en la carpeta de recursos anim y puede iniciar la animación de esta manera (solo un ejemplo):

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);
 96
Author: dmaxi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 20:47:52

Podría rotar la flecha izquierda a la derecha en XML como:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="180"
    android:toDegrees="0"
    android:drawable="@drawable/left">
</rotate>

Imagen adjunta para referencia.

introduzca la descripción de la imagen aquí

 21
Author: amko0l,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-28 20:42:45

Si se utilizan elementos de diseño basados en vectores, junto con una lista de ImageView , estilo y estado de 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 hacen que el código sea claro y explícito (aunque he leído que se debe evitar modificar manualmente los activos vectoriales, prefiero lidiar con la sobrecarga de actualizar un par de archivos que tener transformaciones on one):

Nota: Android Studio es una gran fuente de activos vectoriales.

Res \ values \ styles.xml

<!--ImageView-->
<style name="Details_Buttons_Top_Left_Button">
  <item name="android:layout_width">match_parent</item>
  <item name="android:layout_height">match_parent</item>    
  <item name="android:tint">@color/button_csl</item>    
</style>

Res \ color\button_csl.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:state_enabled="false" android:color="@color/grey_disabled"/>
  <item android:state_pressed="true" android:color="@color/orange_hilite"/>
  <item android:color="@color/black"/>  
</selector>

Details_menu_large_button.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>

Details_Buttons_Top_Left_Button

<ImageView android:id="@+id/Details_Buttons_Top_Left_Button"
           style="@style/Details_Buttons_Top_Left_Button"
           android:src="@drawable/details_menu_large_button" />

And_card_details_button_down_left.xml (ic_play_arrow_black_24dp.xml)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">  
  <path
        android:fillColor="#FF000000"
        android:pathData="M8,5v14l11,-7z"/>

</vector>

And_card_details_button_down_left_onclick.xml (ic_play_arrow_black_24dp.xml modificado)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
  <group android:name="rotationGroup"
         android:pivotX="12"
         android:pivotY="12"
         android:rotation="90" >
    <path
          android:fillColor="#FF000000"
          android:pathData="M8,5v14l11,-7z"/>
  </group>
</vector>
 1
Author: samis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 18:54:28