web-dev-qa-db-fra.com

Est-il possible de faire pivoter un drawable dans la description XML?

Je crée une application avec des ressources pouvant être réutilisées (car les boutons sont toujours les mêmes, mais en miroir ou en rotation). Je souhaite utiliser la même ressource afin de ne pas avoir à ajouter 3 ressources supplémentaires qui sont exactement comme l'original mais qui ont été pivotées. Mais je ne veux pas non plus mélanger le code avec des éléments pouvant être déclarés dans le XML ou effectuer des transformations avec une matrice qui coûtera du temps de traitement.

J'ai un bouton à deux états déclaré dans un fichier 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>

et je veux réutiliser le dessin parce qu’il sera identique mais tourné à 90º et 45º et j’attribue le bouton comme dessinable.

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

Je sais que je peux le faire pivoter avec un RotateDrawable ou un Matrix mais comme je l'ai déjà expliqué, cette approche ne me plait pas .

Est-il possible de réaliser cela directement sur le XML ou que pensez-vous que ce sera la meilleure façon de le faire? Mettez toutes les ressources mais faites pivoter, faites-les pivoter dans le code?

--- EDIT --- La réponse de @dmaxi fonctionne très bien, voici comment la combiner avec une liste d'articles :)

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

Je pourrais faire pivoter 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>

Le fromDegrees est important.

En gros, il s’agit d’une animation de rotation définie en XML. Avec fromDegrees, vous définissez l'état de rotation initiale. Le toDegrees est l'état final pivoté du dessinable dans la séquence d'animation, mais peut être n'importe quoi si vous ne voulez pas utiliser d'animation.

Je ne pense pas qu'il alloue des ressources pour l'animation car il ne doit pas être chargé en tant qu'animation. En tant que dessin, il est rendu dans son état initial et doit être placé dans le dossier de ressources drawable. Pour l'utiliser comme une animation, placez-la dans le dossier de ressources anim et démarrez-la comme ceci (juste un exemple):

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

Je pourrais faire pivoter la flèche gauche à droite dans XML comme suit:

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

Image jointe pour référence.

enter image description here

27
amko0l

Si des éléments dessinables basés sur des vecteurs sont utilisés, en association avec une liste d'états ImageView, style et couleur, votre bouton peut être remanié de la manière suivante:

Remarque: Les dessins vectoriels sont nettement plus petits que les images. Par conséquent, les définitions explicites supplémentaires n'engendrent pas beaucoup de temps système et permettent d'obtenir un code clair et explicite (bien que j'aie déjà lu qu'il faut éviter de modifier manuellement les actifs vectoriels. , Je préfère traiter de la charge de mise à jour de quelques fichiers que de transformations en un):

Remarque: Android Studio est une excellente source d’actifs vectoriels.

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 modifié)

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