È possibile ruotare un disegnabile nella descrizione xml?


102

Sto creando un'app, con risorse che possono essere riutilizzate (perché i pulsanti sono sempre gli stessi, ma specchiati o ruotati). Voglio usare la stessa risorsa, quindi non devo aggiungere altre 3 risorse che sono esattamente come l'originale ma ruotate. Ma non voglio nemmeno mescolare il codice con cose che possono essere dichiarate nell'XML o fare trasformazioni con una matrice che costerà tempo di elaborazione.

Ho un pulsante a due stati dichiarato in 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>

e voglio riutilizzare il disegnabile perché sarà lo stesso ma ruotato di 90º e 45º e lo assegno al pulsante come disegnabile.

<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" />

So che posso ruotarlo con a RotateDrawableo con a Matrixma come ho già spiegato non mi piace questo approccio.

È possibile ottenerlo direttamente sull'XML o quale pensi che sarà il modo migliore per farlo? Metti tutte le risorse ma ruotate, ruotale nel codice?

--- EDIT --- La risposta di @dmaxi funziona alla grande, ecco come combinarla con un elenco di elementi :)

<?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>

4
Non c'è bisogno di scusarsi, il tuo inglese va bene. E benvenuto in SO!
PeeHaa

cerca lo stesso problema su questo thread stackoverflow.com/questions/14727426/… qualsiasi suggerimento sarebbe fantastico!
sukarno

I drawable basati su vettori semplificano notevolmente le cose (risposta sotto).
samis

Risposte:


136

Potrei ruotare in 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>

Il fromDegreesè importante.

Fondamentalmente questa è un'animazione di rotazione definita in XML. Con fromDegreessi definisce lo stato ruotato iniziale. Lo toDegreesè stato ruotato finale del drawable nella sequenza di animazione, ma può essere qualsiasi cosa, se non si desidera utilizzare l'animazione.

Non penso che allochi risorse per l'animazione in quanto non deve essere caricato come animazione. Come disegnabile, viene visualizzato come è lo stato iniziale e deve essere inserito nella drawablecartella delle risorse. Per usarlo come animazione dovresti metterlo nella animcartella delle risorse e puoi avviare l'animazione in questo modo (solo un esempio):

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);

1
Grazie perfetto! l'ho combinato con l'oggetto ed è esattamente ciò di cui ho bisogno, voglio pubblicare il codice, non so se è meglio modificare la tua risposta o la mia domanda ... E per rispecchiare l'immagine devo giocare con pivot x & y?
Goofyahead

Bene, sono felice di poterti aiutare, modifica la risposta se lo desideri. pivotX e pivotY definiscono il punto centrale della rotazione. Per il mirroring non ho idea perché questo XML può definire solo la rotazione 2D.
dmaxi

1
@dmaxi Questo sta ruotando il disegnabile tramite un'animazione di rotazione, non è vero? Non sarebbe un po 'inefficiente?
starkej2

L'ho fatto ma da 0 a 360 gradi perché voglio una rotazione completa, il problema è che nei piccoli schermi ruota deformata, qualche indizio?
Firetrap

1
C'era un bug in Android M che influiva su questa rotazione esatta disegnabile, scompare completamente, quindi se scegli questa soluzione, verrà interrotta in M. È stato risolto per N.
androidguy

34

Potrei ruotare la freccia sinistra a destra in XML come:

<?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>

Immagine allegata per riferimento.

inserisci qui la descrizione dell'immagine


lo sto facendo ma non riesco a impostare lo sfondo per il layout qualche idea?
Mateen Chaudhry

18

Se vengono utilizzati drawable basati su vettori, insieme a un ImageView , uno stile e un elenco di stati del colore, il pulsante può essere refactored come segue:

Nota: i drawable vettoriali sono significativamente più piccoli delle immagini, quindi definizioni extra ed esplicite non comportano molto overhead e rendono il codice chiaro ed esplicito (anche se ho letto che le risorse vettoriali modificate manualmente dovrebbero essere evitate, preferisco occuparmene il sovraccarico di aggiornare un paio di file piuttosto che avere trasformazioni su uno):

Nota: Android Studio è un'ottima fonte di risorse vettoriali.

res \ valori \ 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 modificato)

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

3
Bella risposta per l' rotationGroupattributo, ruota molto bene il vettore
blueware

0

Se si vuole rotationdrawable nel xmlfile di allora semplice add android:rotation="180"aImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.