Personnalisation de l'interface Android avec les ressources Shape et Selector

Dans le développement Android, la personnalisation de l'interface utilisateur repose souvent sur l'utilisation de ressources XML dessinables (drawables). L'utilisation des balises <shape> et <selector> permet de créer des composants avec des bordures arrondies, des dégradés de couleurs d'arrière-plan et des bordures réactives aux états, sans avoir recours à des images matricielles.

Configuration de la mise en page principale

Le fichier de mise en page initial contient un bouton permettant de naviguer vers l'activité de démonstration des styles.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btnNavigate"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Afficher les styles personnalisés"
        android:onClick="navigateToCustomViews"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_margin="16dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Logique de navigation

L'activité principale gère simplement l'événement de clic pour lancer l'activité secondaire.

package com.example.customuidemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
    }

    public void navigateToCustomViews(View view) {
        startActivity(new Intent(this, CustomViewActivity.class));
    }
}

Mise en page de démonstration des styles

Cette mise en page intègre un champ de saisie et un bouton. Le champ de saisie utilise un arrière-plan personnalisé avec une bordure et des coins arrondis. Le bouton utilise un sélecteur d'état pour modifier son apparence lors de l'interaction.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Identifiant :"
        android:textSize="18sp"
        android:layout_marginBottom="8dp"/>

    <EditText
        android:id="@+id/inputUsername"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@drawable/edit_text_background"
        android:paddingStart="12dp"
        android:paddingEnd="12dp"
        android:layout_marginBottom="24dp"/>

    <Button
        android:id="@+id/btnGradient"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/button_state_background"
        android:text="Bouton avec état et dégradé"
        android:textColor="@android:color/white"/>
</LinearLayout>

Activité secondaire

package com.example.customuidemo;

import android.app.Activity;
import android.os.Bundle;

public class CustomViewActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_view);
    }
}

Définition de l'arrière-plan du champ de saisie

Le fichier edit_text_background.xml définit une forme rectangulaire avec un remplissage blanc, une bordure verte, des coins arrondis et un espacement interne.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    
    <solid android:color="#FFFFFF" />
    
    <stroke 
        android:width="2dp" 
        android:color="#4CAF50" />
        
    <corners android:radius="12dp" />
    
    <padding 
        android:left="8dp" 
        android:top="8dp" 
        android:right="8dp" 
        android:bottom="8dp" />
</shape>

Définition de l'arrière-plan réactif du bouton

Le fichier button_state_background.xml utilise un <selector> pour basculer entre deux états. À l'état pressé, la bordure change de couleur et un dégradé horizontal est appliqué. À l'état par défaut, un remplissage uni est utilisé.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <!-- État pressé -->
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <stroke 
                android:width="2dp" 
                android:color="#E91E63" />
            <corners android:radius="8dp" />
            <gradient 
                android:startColor="#4CAF50" 
                android:endColor="#E91E63" 
                android:angle="0" />
        </shape>
    </item>
    
    <!-- État par défaut -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#2196F3" />
            <stroke 
                android:width="2dp" 
                android:color="#4CAF50" />
            <corners android:radius="8dp" />
        </shape>
    </item>
    
</selector>

Déclaration des couleurs

Les couleurs utilisées dans les ressuorces peuvent être centralisées dans le fichier colors.xml.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="primary_blue">#2196F3</color>
    <color name="dark_blue">#1976D2</color>
    <color name="accent_pink">#E91E63</color>
    <color name="success_green">#4CAF50</color>
</resources>

Étiquettes: Android XML Drawable Shape Selector

Publié le 7 juillet à 20h36