113 votes

Est-il possible de faire pivoter un dessin dans la description xml ?

Je suis en train de créer une application, avec des ressources qui peuvent être réutilisées (parce que les boutons sont toujours les mêmes, mais en miroir ou en rotation). Je veux utiliser la même ressource pour ne pas avoir à ajouter 3 autres ressources qui sont exactement comme l'original mais avec une rotation. Mais je ne veux pas non plus mélanger le code avec des choses qui peuvent être déclarées dans le XML ou faire des transformations avec une matrice qui coûteront du temps de traitement.

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

et je veux réutiliser le dessinable parce qu'il sera le même mais tourné de 90º et 45º et je l'assigne au bouton en tant que 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 à l'aide d'un RotateDrawable ou avec un Matrix mais comme je l'ai déjà expliqué, je n'aime pas cette approche.

Est-il possible de réaliser cela directement sur le XML ou quelle est, selon vous, la meilleure façon de procéder ? Mettre toutes les ressources mais avec une rotation, les faire 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>

145voto

dmaxi Points 1502

Je pourrais tourner 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>

En fromDegrees est importante.

Il s'agit en fait d'une animation de rotation définie en XML. Avec fromDegrees vous définissez l'état initial de la rotation. L'état toDegrees est l'état final de rotation de l'objet dessiné dans la séquence d'animation, mais peut être n'importe quoi si vous ne voulez pas utiliser l'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 dessinable, il est rendu en tant qu'état initial et devrait être placé dans la section drawable dossier de ressources. Pour l'utiliser en tant qu'animation, vous devez le placer dans le dossier anim et peut démarrer l'animation comme suit (juste un exemple) :

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

38voto

amko0l Points 360

Je pourrais faire pivoter la flèche gauche vers la droite en XML :

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

28voto

Samus Arin Points 1117

Si des objets vectoriels sont utilisés, en conjonction avec un objet de type ImageView , de style et de couleur, votre bouton peut être remanié comme suit :

Remarque : Les objets vectoriels sont nettement plus petits que les images, de sorte que des définitions supplémentaires et explicites n'entraînent pas beaucoup de frais généraux et permettent d'obtenir un code clair et explicite (bien que j'aie lu qu'il fallait éviter de modifier à la main les objets vectoriels, je préfère m'occuper des frais généraux liés à la mise à jour de quelques fichiers plutôt que d'avoir des transformations sur un seul) :

Remarque : Android Studio est une excellente source de ressources vectorielles.

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>

Boutons_détaillés_en_haut_à_gauche

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

6voto

Dinesh Songra Points 53

Si vous voulez rotation dans xml il suffit alors d'ajouter android:rotation="180" en ImageView

<ImageView
    android:id="@+id/imageview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>

Par programme

val image = findViewById(R.id.imageview)
image.rotation = 180f

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X