Maison >Java >javaDidacticiel >Comment créer un groupe de vues personnalisé pour les mises en page avec saut de ligne ?

Comment créer un groupe de vues personnalisé pour les mises en page avec saut de ligne ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-08 02:32:01728parcourir

How to Create a Custom ViewGroup for Line-Breaking Layouts?

ViewGroup personnalisé pour la mise en page avec saut de ligne

Problème :

Vous devez créer un disposition qui présente plusieurs widgets de manière encapsulable, en les divisant en lignes si nécessaire pour s'adapter à l'espace disponible. Les composants ViewGroup par défaut ne disposent pas de cette fonctionnalité.

Solution :

Pour réaliser un saut de ligne, vous pouvez créer un ViewGroup personnalisé. Voici comment :

  1. Mesurer les enfants :

    Dans onMeasure(), calculez la largeur disponible et parcourez les vues enfants. Pour chaque enfant, mesurez sa largeur et sa hauteur. Mettez à jour line_height pour représenter la hauteur maximale de tout enfant dans une ligne donnée.

  2. Déterminez les sauts de ligne :

    Pendant la mesure, vérifiez si le la largeur accumulée des vues enfants dépasse la largeur disponible. Si tel est le cas, réinitialisez la largeur et incrémentez le ypos à la ligne suivante.

  3. Définissez les paramètres de mise en page :

    Remplacez generateDefaultLayoutParams() et checkLayoutParams () pour définir vos paramètres de mise en page personnalisés. Ces paramètres peuvent spécifier l'espacement entre les widgets, par exemple.

  4. Layout Child Views :

    Dans onLayout(), parcourez à nouveau les vues enfants et positionnez-les en fonction des dimensions mesurées et des variables xpos et ypos. Mettez à jour xpos lorsque vous ajoutez des widgets à la ligne.

  5. Fournir la prise en charge des attributs XML :

    Créez un attribut XML personnalisé pour exposer les paramètres de mise en page. Cela vous permet de les spécifier dans vos fichiers XML de mise en page.

Exemple de mise en œuvre :

public class PredicateLayout extends ViewGroup {

    private int line_height;

    public PredicateLayout(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // Calculate available width
        // Iterate through child views and measure them

        if (xpos + childw > width) {
            xpos = getPaddingLeft();
            ypos += line_height;
        }
        ...
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        for (int i = 0; i < count; i++) {
            if (xpos + childw > width) {
                xpos = getPaddingLeft();
                ypos += line_height;
            }
            // Position the child view
        }
    }
}

En utilisant cette mise en page personnalisée, vous pouvez obtenez le comportement encapsulable souhaité pour vos widgets.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn