Résumé de 13 Drawables dans Android Part 3


Introduction à cette section :

Dans cette section, nous apprendrons les quatre Drawables restants, qui sont : LayerDrawable,TransitionDrawable , LevelListDrawable et StateListDrawable, Collez toujours la carte de 13 types de Drawable :

1.png


1.LayerDrawable

objet graphique de calque, dont un Drawable tableau, puis dessinez-les dans l'ordre correspondant au tableau, index Le Drawable avec la plus grande valeur sera dessiné sur le calque supérieur ! Bien que ces Drawables aient des zones qui se croisent ou se chevauchent, Ils sont situés dans des couches différentes, ils ne s'affecteront donc pas, avec <layer-list>

Les attributs pertinents sont les suivants :

  • drawable : la ressource bitmap référencée, si elle est vide Xu 璈Il y a un nœud enfant de type Drawable
  • gauche : la marge gauche du calque par rapport au conteneur
  • droite : la marge droite du calque par rapport au conteneur
  • top : La marge supérieure du calque par rapport au conteneur
  • bottom : La marge inférieure de la couche par rapport au conteneur
  • id : Layer id

Exemple d'utilisation :

Exécuter le rendu  :

2.gif

Implémentation du code :

est très simple, combiné avec les apprentissages shapeDrawable et ClipDrawable plus tôt :

layerList_one.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="#C2C2C1" />
            <corners android:radius="50dp" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#BCDA73" />
                <corners android:radius="50dp" />
            </shape>
        </clip>
    </item>
</layer-list>

Ensuite, ajoutez une Seekbar dans le fichier de mise en page avec le contenu suivant :

<SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"
        android:indeterminateOnly="false"
        android:maxHeight="10dp"
        android:minHeight="5dp"
        android:progressDrawable="@drawable/layerlist_one"
        android:thumb="@drawable/shape_slider" />

Putain, c'est parti ? Oui, c'est tout ~ En parlant d'objets graphiques de calque, on peut aussi obtenir l'effet de images en cascade  :

Exécuter le rendu  :

3.png

Code d'implémentation :

layerlist_two.xml d'images en cascade:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_bg_ciwei" />
    </item>
    <item
        android:left="25dp"
        android:top="25dp">
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_bg_ciwei" />
    </item>
    <item
        android:left="50dp"
        android:top="50dp">
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_bg_ciwei" />
    </item>
</layer-list>

Puis dans Activity_main, ajoutez une ImageView à .xml avec le contenu suivant :

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/layerlist_two"/>

4.jpgC'est simple et facile à utiliser. Qu'attendez-vous ? Appliquez-le rapidement à votre projet~


2.TransitionDrawable<. 🎜>

Sous-classe de LayerDrawable, TransitionDrawable ne gère que deux couches de Drawable ! Deux étages ! Deux étages ! Il fournit également une animation de changement de transparence, qui peut contrôler l'effet d'animation d'un calque de Drawable passant à un autre calque de Drawable. Le nœud racine est <

transition>. N'oubliez pas qu'il n'y a que deux éléments. Les propriétés sont similaires à LayerDrawable. Nous devons appeler la méthode startTransition pour démarrer l'animation de commutation entre les deux calques ; Vous pouvez également appeler la méthode reverseTransition() pour jouer à l'envers :

Exemple d'utilisation :

Exécution de rendus :

5.gif

Code d'implémentation  :

Créez un fichier XML TransitionDrawable dans res/drawable

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@mipmap/ic_bg_meizi1"/>
    <item android:drawable="@mipmap/ic_bg_meizi2"/>
</transition>

Ajoutez ensuite un ImageView au fichier de mise en page, puis définissez src sur le dessin ci-dessus Ensuite, le contenu de MainActivity.java est le suivant :

public class MainActivity extends AppCompatActivity {
    private ImageView img_show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        TransitionDrawable td = (TransitionDrawable) img_show.getDrawable();
        td.startTransition(3000);
        //你可以可以反过来播放,使用reverseTransition即可~
        //td.reverseTransition(3000);
    }
}

De plus, si vous souhaitez obtenir : l'effet de fondu d'entrée et de sortie de plusieurs cycles d'image Vous pouvez vous référer à : Android Drawable Resource Learning (7), Exemples dans TransitionDrawable C'est très simple. Le principe de base est le suivant : le gestionnaire modifie régulièrement les deux images de la Transition !


3.LevelListDrawable

est utilisé pour gérer un groupe de Drawables Nous pouvons définir différents niveaux pour les drawables à l'intérieur. Lorsqu'ils dessinent, ils obtiendront le dessin correspondant en fonction de la valeur de l'attribut de niveau et le dessineront sur le canevas. Le nœud racine. Pour :<level-list>, il n'a aucun attribut pouvant être défini. Tout ce que nous pouvons faire est de définir chaque <élément> propriétés!

Les attributs d'élément qui peuvent être définis sont les suivants  :

  • dessinable : ressource bitmap référencée, si S'il est vide, Xu Yan a un nœud enfant de type Drawable
  • minlevel:level valeur minimale correspondante
  • maxlevel:level valeur maximale correspondante

Exemple d'utilisation :

Exécution du rendu :

6.gif

Implémentation du code :

Dessinez un cercle via shapeDrawable, en cinq exemplaires, changez simplement la largeur et la hauteur :

shape_cir1.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#2C96ED"/>
    <size android:height="20dp" android:width="20dp"/>
</shape>

Ensuite, allez dans LevelListDrawable, ici nous définissons cinq niveaux :

level_cir.xml :

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/shape_cir1" android:maxLevel="2000"/>
    <item android:drawable="@drawable/shape_cir2" android:maxLevel="4000"/>
    <item android:drawable="@drawable/shape_cir3" android:maxLevel="6000"/>
    <item android:drawable="@drawable/shape_cir4" android:maxLevel="8000"/>
    <item android:drawable="@drawable/shape_cir5" android:maxLevel="10000"/>
</level-list>

Enfin, écrivez le code suivant pour MainActivity :

public class MainActivity extends AppCompatActivity {

    private ImageView img_show;

    private LevelListDrawable ld;
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {
                if (ld.getLevel() > 10000) ld.setLevel(0);
                img_show.setImageLevel(ld.getLevel() + 2000);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_show = (ImageView) findViewById(R.id.img_show);
        ld = (LevelListDrawable) img_show.getDrawable();
        img_show.setImageLevel(0);
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0x123);
            }
        }, 0, 100);
    }
}

C'est aussi très simple, un timer, un gestionnaire change la valeur du niveau~


4 StateListDrawable

D'accord, enfin nous avons le dernier dessinable : StateListDrawable. , ce nom ressemble à un modèle, mais en réalité nous Je l'ai déjà utilisé. Vous souvenez-vous encore de définir le dessin des différents états pour le bouton ? C'est vrai, utilisé C'est ce StateListDrawable !

Les attributs pouvant être définis sont les suivants

 :

  • drawable : Le bitmap Drawable référencé, on peut le mettre au premier plan pour indiquer l'état normal du composant~
  • state_focused : S'il faut obtenir le focus
  • state_window_focused : S'il faut obtenir le focus de la fenêtre
  • state_enabled : Si le contrôle est disponible
  • state_checkable : si le contrôle peut être vérifié, par exemple : checkbox
  • state_checked : si le contrôle est vérifié
  • state_selected : si le contrôle est coché Sélectionnez, pour la situation avec une molette de défilement
  • state_pressed : si le contrôle est enfoncé
  • state_active : si le contrôle est actif, par exemple : slideTab
  • state_single : Lorsque le contrôle contient plusieurs contrôles enfants, déterminez s'il faut afficher un seul contrôle enfant
  • state_first : Lorsque le contrôle contient plusieurs contrôles enfants, déterminez le premier contrôle enfant. Si un contrôle enfant est dans l'état affiché
  • state_middle : Lorsque le contrôle contient plusieurs contrôles enfants, déterminez si le le contrôle enfant du milieu est dans l'état affiché
  • state_last : Lorsqu'un contrôle contient plusieurs sous-contrôles, déterminez si le dernier sous-contrôle est dans l'état affiché

Exemple d'utilisation :

Ensuite, écrivez un bouton simple aux coins arrondis !

Exécution des rendus :

7.gif

Implémentation du code :

Puis passez-le d'abord shapeDrawable pour dessiner deux rectangles arrondis, juste avec des couleurs différentes :

shape_btn_normal.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#DD788A"/>
    <corners android:radius="5dp"/>
    <padding android:top="2dp" android:bottom="2dp"/>
</shape>

Écrivons ensuite un selctor : selctor_btn

<?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/shape_btn_pressed"/>
    <item android:drawable="@drawable/shape_btn_normal"/>
</selector>

Ensuite, définissez le bouton android:background="../style/images/selctor_btn" et c'est tout~ Vous pouvez le changer en rectangle, ellipse, cercle, etc. selon vos besoins !


Résumé de cette section :

D'accord, nous avons fini d'expliquer les 13 types différents de Drawables dans Android. Bien sûr, ce ne sont que les bases. Il doit y avoir diverses utilisations de haut niveau dans le développement, et c'est à chacun de les développer. Voici juste un guide pour chacun !

Eh bien, en raison de contraintes de temps, les exemples ci-dessus ont été essayés un par un, donc la démo finale était peut-être un gâchis. Si vous avez besoin de ces documents, merci de les publier et de les télécharger vous-même si nécessaire : DrawableDemo.zip Eh bien, merci ~ Bon week-end