dessiner
- Le dessin est un processus en deux étapes (deux passes): une passe de mesure et une passe de mise en page.
- La passe de mesure est implémentée en mesure (int, int), de haut en bas à partir du haut de l'arbre. Dans ce processus récursif, chaque vue transmettra ses propres spécifications de dimension. À la fin de la passe de mesure, chaque vue a stocké ses propres mesures, c'est-à-dire les résultats des mesures.
- La seconde est la passe de mise en page (passe de mise en page), qui se produit dans la mise en page (int, int, int, int), qui est toujours descendante.
void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
- En général, le remplacement de la méthode onMeasure () consiste à personnaliser les règles de taille de la vue. Si la taille de votre vue personnalisée est cohérente avec le comportement du contrôle parent, vous n'avez pas besoin de remplacer la méthode onMeasure ().
- Si vous ne remplacez pas la méthode onMeasure, la taille de la vue personnalisée est la même que celle du contrôle parent par défaut. Bien sûr, vous pouvez également écrire la largeur et la hauteur dans le fichier de disposition et remplacer cette méthode pour définir la vue personnalisée. taille selon vos besoins.
- Lors de la substitution de la méthode onMeasure, vous devez appeler setMeasuredDimension (int, int) pour stocker la largeur et la hauteur mesurées de cette vue. Si cela n'est pas fait, une IllegalStateException sera levée par la méthode measure (int, int).
- Réinitialisez la taille de la vue enfant dans la méthode onMeasure () dans ViewGroup, comme suit:
- void measureChild (View child, int parentWidthMeasureSpec,
int parentHeightMeasureSpec); 设置 指定 的 childView 的 MeasureSpec - void measureChildWithMargins (View child,
int parentWidthMeasureSpec, int widthUsed,
int parentHeightMeasureSpec, int heightUsed); Lors de la définition de MeasureSpec de childView, le remplissage et la marge sont ajoutés, ainsi que la largeur supplémentaireUsed et la hauteurUsed spécifiées - void measureChildren (int widthMeasureSpec, int heightMeasureSpec); Définir MeasureSpec pour tous les childView
- void measureChild (View child, int parentWidthMeasureSpec,
- Bien que les paramètres widthMeasureSpec et heightMeasureSpec soient de type int, ils ne représentent pas la taille de la vue, mais sont la valeur combinée de l'opération de bit effectuée par la taille et le mode.
- Obtenez la méthode size (size): MeasureSpec.getSize (widthMeasureSpec); il s'agit de la taille de la vue
- La méthode pour obtenir le mode (mode): MeasureSpec.getMode (widthMeasureSpec); Le type de mode est le suivant:
-
NON SPÉCIFIÉ: Le parent n'impose aucune contrainte à l'enfant, et l'enfant peut être de n'importe quelle taille (c'est-à-dire non spécifiée)
-
EXACTEMENT: Le père détermine la taille exacte de l'enfant, et l'enfant est limité à la limite donnée, ignorant la taille qu'il veut
-
AT_MOST: taille maximale que l'enfant peut atteindre. Lorsqu'il est défini sur wrap_content, le mode est AT_MOST, ce qui indique la taille maximale de la vue enfant, de sorte que la vue enfant définisse sa propre taille en fonction de cette limite supérieure
-
- La relation correspondante entre le contrôle parent et le contrôle enfant MeasureSpec est la suivante:
void onLayout (boolean changé, int gauche, int haut, int droite, int bas)
- Le paramètre de la méthode onLayout () dans le ViewGroup personnalisé est la différence entre les coordonnées de ses quatre sommets par rapport au coin supérieur gauche.
- Le paramètre de la méthode onLayout () dans la vue personnalisée est la différence entre les coordonnées des 4 sommets par rapport au coin supérieur gauche de la disposition parent. Les paramètres de la méthode onLayout () dans la vue sont décrits comme suit:
- Définissez la position de la vue enfant en calculant les coordonnées des quatre sommets de la vue enfant à travers certaines règles en fonction des paramètres, et utilisez la méthode view.layout () pour appeler la méthode onLayout () de la vue enfant.
- La méthode layout () calculera les valeurs des 4 attributs de la vue: mLeft; mTop; mBottom; mRight. La méthode correspondante est view.getLeft (); view.getTop (); view.getBottom (); view.getRight () La signification est la suivante
- mLeft: la distance entre le bord gauche de la vue enfant et le bord gauche de la vue parent
- mTop: la distance entre la limite supérieure de la vue enfant et la limite supérieure de la vue parent
- mRight: la distance entre le bord droit de la vue enfant et le bord gauche de la vue parent
- mBottom: la distance entre la marge inférieure de la vue enfant et la limite supérieure de la vue parent