Fundamentkonsolidierung (6) Benutzerdefinierte Ansicht

Zeichenvorgang anzeigen

Fügen Sie hier eine Bildbeschreibung ein
Vor dem Zeichnen führt das System einige Zeichnungsvorbereitungen durch, um PhoneWindow, DecorView und ViewRootImpl zu erstellen. Dieser Prozess befindet sich in onCreate() der Aktivität.

Der Zeichenprozess von View beginnt mit performTraversals() des ViewRootImpl-Objekts

/**
  * 源码分析:ViewRootImpl.performTraversals()
  */
  private void performTraversals() {
    
    
  		// 1. 执行measure流程
        // 内部会调用performMeasure()
        measureHierarchy(host, lp, res,desiredWindowWidth, desiredWindowHeight);

        // 2. 执行layout流程
        performLayout(lp, mWidth, mHeight);

        // 3. 执行draw流程
        performDraw();
    }

Der Ansichtszeichnungsprozess beginnt bei der Ansichtsgruppe der Ansicht der obersten Ebene (DecorView) und durchläuft die Zuordnung von der Ansichtsgruppe zur Unteransicht Schicht für Schicht: Messen, Layout, Zeichnen.
Fügen Sie hier eine Bildbeschreibung ein

  • Ausgehend von der Stammansicht durchläuft die Tiefensuche jede Unteransicht, um Messungen durchzuführen

  • Ausgehend von der Stammansicht durchläuft eine Tiefensuche jede untergeordnete Ansicht, um das Layout auszuführen

  • Ausgehend von der Stammansicht durchläuft die Tiefensuche jede untergeordnete Ansicht, um das Zeichnen auszuführen

Fügen Sie hier eine Bildbeschreibung ein

Messen

Die Funktion von Measure besteht darin, die Breite/Höhe der Ansicht zu messen
In einigen Fällen, wenn die Größe der Ansicht durch dynamische Inhalte, responsives Design, Layoutbeschränkungen oder Animationseffekte beeinflusst wird, sind möglicherweise mehrere Messungen erforderlich, um die endgültige Breite oder Höhe zu bestimmenDaher ist die durch den Messvorgang ermittelte Breite/Höhe möglicherweise nicht genau.建议在layout过程中的onLayout去获取最终的宽 / 高。

Der Messvorgang einer Einzelansicht:

  • Measure(): Beurteilung der grundlegenden Messlogik
  • onMeasure(): in zwei Schritte unterteilt
    • getDefaultSize(): Berechnen Sie die Breite und Höhe der Ansicht gemäß der Spezifikation für die Breite/Höhe der Ansicht
    • setMeasure(): speichert die gemessene Breite/Höhe der Unteransicht

Der Messprozess von ViewGroup:

注意:ViewGroup的measure过程中,等待所有的子view都measure完毕,合并所有子view的尺寸才可以得到ViewGroup父视图的测量值。

Fügen Sie hier eine Bildbeschreibung ein

Layout

Die Funktion des Layoutprozesses besteht darin, die Position der Ansichtsansicht zu berechnen, dh
die vier Scheitelpunktpositionen der Ansicht: links, oben, rechts und unten.
Fügen Sie hier eine Bildbeschreibung ein

Ziehen

Die Funktion des Draw-Prozesses besteht darin, die Ansichtsansicht zu zeichnen.
Eine einzelne Ansicht muss nur sich selbst (einschließlich Hintergrund, Inhalt) und Dekoration zeichnen.

Hinweis: Dekoration bezieht sich hier auf Anzeige, Bildlaufleiste und Vordergrund

Die Zeichnung von ViewGroup umfasst:

  • Selbstzeichnung (mit Hintergrund und Inhalt)
  • Durchlaufen von Unteransichten, Zeichnen nacheinander (Hintergrund, Inhalt und Dekoration)
  • Zeichnungsdekoration von ViewGroup
    Fügen Sie hier eine Bildbeschreibung ein

Schritte zum Implementieren einer benutzerdefinierten Ansicht

Schritt 1: Implementieren Sie den Maß-, Layout- und Zeichnungsprozess

  • Wenn Sie im Ansichtsworkflow (Messprozess, Layoutprozess, Zeichenprozess) eine benutzerdefinierte Ansicht implementieren möchten, müssen Sie je nach Typ der benutzerdefinierten Ansicht (einzelne Ansicht / Ansichtsgruppe) verschiedene Methoden anpassen und implementieren
  • Hauptsächlich onMeasure(), onLayout(), onDraw(), wie folgt:
    Fügen Sie hier eine Bildbeschreibung ein

Maßgeschneiderte Maßnahme

ViewGroup.LayoutParams

Die Unterklassen von ViewGroup (RelativeLayout, LinearLayout) haben ihre entsprechenden ViewGroup.LayoutParams-Unterklassen

Seine Aufgabe besteht darin, Layoutparameter wie die Höhe und Breite der Ansichtsansicht anzugeben.
Im Einzelnen wird es durch die folgenden Parameter angegeben:
Fügen Sie hier eine Bildbeschreibung ein
in der entsprechenden XML-Datei:

android:layout_height="wrap_content"   //自适应大小  
android:layout_height="match_parent"   //与父视图等高  
android:layout_height="fill_parent"    //与父视图等高  
android:layout_height="100dip"         //精确设置高度值为 100dip  

MeasureSpec

MeasureSpec: Richtlinienregel, die aus Messmodus (Modus) und Messgröße (Größe) besteht, insgesamt 32 Bit (int-Typ), davon belegt der Modus 2 Bit und die Größe die unteren 30 Bit.

Fügen Sie hier eine Bildbeschreibung ein
Es gibt drei Messmodi:

  • NICHT SPEZIFIZIERT: Die übergeordnete Ansicht schränkt die untergeordnete Ansicht nicht ein, z. B. ListView, ScrollView, aber im Allgemeinen ist dies für benutzerdefinierte Ansichten nicht erforderlich.
  • GENAU: Die übergeordnete Ansicht gibt eine genaue Größe für die untergeordnete Ansicht an, und die Größe der untergeordneten Ansicht muss dieser Größe entsprechen. Geben Sie beispielsweise match_parent ein oder geben Sie einen bestimmten Wert von 100 dp an. In diesem Modus ignoriert der Messvorgang der Ansicht die Layoutparameter der Ansicht ( LayoutParams).
  • AT_MOST: Die übergeordnete Ansicht gibt eine maximale Größe für die untergeordnete Ansicht an, und die untergeordnete Ansicht muss sicherstellen, dass sie selbst und alle untergeordneten Ansichten in diese Größe passen. Beispiel: Wrap_Content, adaptive Größe, die spezifische Größe wird entsprechend den Anforderungen festgelegt. In diesem Modus kann das übergeordnete Steuerelement die Größe der untergeordneten Ansicht nicht bestimmen und kann die Größe nur entsprechend den Anforderungen des untergeordneten Steuerelements selbst entwerfen und berechnen.

Die spezifische Verwendung von MeasureSpec:
Die MeasureSpec-Klasse kapselt den Messmodus (mode) und die Messgröße (size) mit einer Variablen: Durch die Verwendung von Binärdaten werden der Messmodus (mode) und die Messgröße (size) in einen int-Wert gepackt Die Verpackung wird bereitgestellt und die Methode zum Entpacken besteht darin, die Objektspeicherzuweisung zu reduzieren und die Zugriffseffizienz zu verbessern. Die konkrete Verwendung ist wie folgt:

// 1. 获取测量模式(Mode)
int specMode = MeasureSpec.getMode(measureSpec)

// 2. 获取测量大小(Size)
int specSize = MeasureSpec.getSize(measureSpec)

// 3. 通过Mode 和 Size 生成新的SpecMode
int measureSpec=MeasureSpec.makeMeasureSpec(size, mode);

individuelles Layout

Die Rolle des Layouts besteht darin, die vier Scheitelpunktpositionen der Ansicht zu berechnen: Links, Oben, Rechts und Unten

benutzerdefinierte Attribute

  1. Erstellen Sie benutzerdefinierte Attribut-XML-Dateien im Werteverzeichnis
  2. Laden Sie benutzerdefinierte XML-Dateien und analysieren Sie Eigenschaftswerte im Konstruktor der benutzerdefinierten Ansicht
  3. Verwendung benutzerdefinierter Attribute in Layoutdateien

Zeichenutensilien

Malen

Farbe: Pinsel. Seine Funktion besteht darin, den spezifischen Effekt des gezeichneten Inhalts (z. B. Farbe, Größe usw.) zu bestimmen. Der Pinsel wird beim Zeichnen des Inhalts benötigt.

Spezifische Verwendung

Schritt:

  1. Erstellen Sie ein Paint-Objekt
  2. Stellen Sie den Pinsel ein, also den Effekt beim Zeichnen von Inhalten, wie Farbe und Größe
  3. Initialisieren Sie den Pinsel (versuchen Sie, den Konstruktor in View auszuwählen)

Weg

Leinwand

Leinwand: Leinwand ist eine Regel beim Zeichnen, und der Zeicheninhalt wird gemäß den Vorschriften der Leinwand auf dem Bildschirm gezeichnet.

Supongo que te gusta

Origin blog.csdn.net/baiduwaimai/article/details/131013264
Recomendado
Clasificación