RenderNode Klasse

Definition

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

[Android.Runtime.Register("android/graphics/RenderNode", ApiSince=29, DoNotGenerateAcw=true)]
public sealed class RenderNode : Java.Lang.Object
[<Android.Runtime.Register("android/graphics/RenderNode", ApiSince=29, DoNotGenerateAcw=true)>]
type RenderNode = class
    inherit Object
Vererbung
RenderNode
Attribute

Hinweise

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen. Jeder RenderNode enthält sowohl eine Anzeigeliste als auch eine Reihe von Eigenschaften, die sich auf das Rendern der Anzeigeliste auswirken. RenderNodes werden standardmäßig für alle Ansichten intern verwendet und werden normalerweise nicht direkt verwendet.

RenderNodes werden verwendet, um den Renderinginhalt einer komplexen Szene in kleinere Teile aufzuteilen, die dann einzeln günstiger aktualisiert werden können. Das Aktualisieren eines Teils der Szene muss nur die Anzeigeliste oder -eigenschaften einer kleinen Anzahl von RenderNode aktualisieren, anstatt alles neu zu erstellen. Ein RenderNode benötigt nur die neu aufgezeichnete Anzeigeliste, wenn der Inhalt allein geändert werden soll. RenderNodes können auch transformiert werden, ohne die Anzeigeliste über die Transformationseigenschaften erneut aufzuzeichnen.

Ein Text-Editor kann beispielsweise jeden Absatz in einem eigenen RenderNode speichern. Wenn der Benutzer Also Zeichen einfügt oder entfernt, muss nur die Anzeigeliste des betroffenen Absatzes erneut aufgezeichnet werden.

<h3>Hardwarebeschleunigung</h3>

RenderNodes können mit einer RecordingCanvas. Sie werden in Software nicht unterstützt. Stellen Sie immer sicher, dass die android.graphics.Canvas Zum Rendern einer Anzeigeliste verwendete Hardware mithilfe von android.graphics.Canvas#isHardwareAccelerated()Hardware beschleunigt wird.

<h3>Erstellen eines RenderNode</h3>

RenderNode renderNode = new RenderNode("myRenderNode");
                renderNode.setPosition(0, 0, 50, 50); // Set the size to 50x50
                RecordingCanvas canvas = renderNode.beginRecording();
                try {
                    // Draw with the canvas
                    canvas.drawRect(...);
                } finally {
                    renderNode.endRecording();
                }

<h3>Zeichnen eines RenderNodes in einer Ansicht</h3>

protected void onDraw(Canvas canvas) {
                    if (canvas.isHardwareAccelerated()) {
                        // Check that the RenderNode has a display list, re-recording it if it does not.
                        if (!myRenderNode.hasDisplayList()) {
                            updateDisplayList(myRenderNode);
                        }
                        // Draw the RenderNode into this canvas.
                        canvas.drawRenderNode(myRenderNode);
                    }
                }

<h3>Freigeben von Ressourcen</h3>

Dieser Schritt ist nicht obligatorisch, wird jedoch empfohlen, wenn Sie Ressourcen freigeben möchten, die von einer Anzeigeliste so schnell wie möglich gehalten werden. Die wichtigsten Bitmaps, die sie enthalten können.

// Discards the display list content allowing for any held resources to be released.
                // After calling this
                renderNode.discardDisplayList();

<h3-Eigenschaften></h3>

Darüber hinaus bietet ein RenderNode mehrere Eigenschaften, z #setScaleX(float) . B. oder #setTranslationX(float),, die verwendet werden können, um alle Zeichnungsbefehle zu beeinflussen, die in diesem Bereich aufgezeichnet werden. Beispielsweise können diese Eigenschaften verwendet werden, um eine große Anzahl von Bildern zu navigieren, ohne alle einzelnen canvas.drawBitmap() Aufrufe erneut auszustellen.

private void createDisplayList() {
                    mRenderNode = new RenderNode("MyRenderNode");
                    mRenderNode.setPosition(0, 0, width, height);
                    RecordingCanvas canvas = mRenderNode.beginRecording();
                    try {
                        for (Bitmap b : mBitmaps) {
                            canvas.drawBitmap(b, 0.0f, 0.0f, null);
                            canvas.translate(0.0f, b.getHeight());
                        }
                    } finally {
                        mRenderNode.endRecording();
                    }
                }

                protected void onDraw(Canvas canvas) {
                    if (canvas.isHardwareAccelerated())
                        canvas.drawRenderNode(mRenderNode);
                    }
                }

                private void moveContentBy(int x) {
                     // This will move all the bitmaps recorded inside the display list
                     // by x pixels to the right and redraw this view. All the commands
                     // recorded in createDisplayList() won't be re-issued, only onDraw()
                     // will be invoked and will execute very quickly
                     mRenderNode.offsetLeftAndRight(x);
                     invalidate();
                }

Einige der Eigenschaften können zunächst redundant erscheinen, z #setElevation(float) . B. und #setTranslationZ(float). Der Grund für diese Duplikate besteht darin, eine Trennung zwischen statischen und vorübergehenden Verwendungen zu ermöglichen. Betrachten Sie beispielsweise eine Schaltfläche, die beim Drücken von 2DP auf 8DP anhebt. Um dies zu erreichen, kann eine Anwendung entscheiden, dieElevation(2dip) festzulegen, und dann auf drücken, um setTranslationZ auf 6dip zu animieren. Kombiniert erreicht dies den endgültig gewünschten 8dip-Wert, aber die Animation muss sich nur mit dem Animieren des Lifts von der Presse befassen, ohne den anfänglichen Startwert kennen zu müssen. #setTranslationX(float) und #setTranslationY(float) werden ähnlich für die Verwendung von Animationen bereitgestellt, obwohl die funktionale Überlappung mit #setPosition(Rect).

Die RenderNode-Transformationsmatrix wird zur Renderzeit wie folgt berechnet:

Matrix transform = new Matrix();
                transform.setTranslate(renderNode.getTranslationX(), renderNode.getTranslationY());
                transform.preRotate(renderNode.getRotationZ(),
                        renderNode.getPivotX(), renderNode.getPivotY());
                transform.preScale(renderNode.getScaleX(), renderNode.getScaleY(),
                        renderNode.getPivotX(), renderNode.getPivotY());

Die aktuelle Canvastransformationsmatrix, die in die Position von RenderNode übersetzt wird, wird dann mit der Transformationsmatrix von RenderNode multipliziert. Daher wirkt sich die Sortierung von Aufrufen von Eigenschaftensatzern nicht auf das Ergebnis aus. Das heißt:

renderNode.setTranslationX(100);
                renderNode.setScaleX(100);

entspricht:

renderNode.setScaleX(100);
                renderNode.setTranslationX(100);

<h3>Threading</h3>

RenderNode kann für jeden Thread erstellt und verwendet werden, sind aber nicht threadsicher. Nur ein einzelner Thread kann jederzeit mit einem RenderNode interagieren. Es ist wichtig, dass renderNode nur für denselben Thread verwendet wird, mit dem er gezeichnet wird. Wenn Sie z. B. RenderNode mit einer benutzerdefinierten Ansicht verwenden, darf RenderNode nur aus dem UI-Thread verwendet werden.

<h3>Wann wird erneut gerendert</h3>

Viele der RenderNode-Mutationsmethoden, z #setTranslationX(float). B. , geben einen booleschen Wert zurück, der angibt, ob der Wert tatsächlich geändert wurde oder nicht. Dies ist nützlich, um zu erkennen, ob ein neuer Frame gerendert werden soll oder nicht. Eine typische Verwendung würde wie folgt aussehen:

public void translateTo(int x, int y) {
                    boolean needsUpdate = myRenderNode.setTranslationX(x);
                    needsUpdate |= myRenderNode.setTranslationY(y);
                    if (needsUpdate) {
                        myOwningView.invalidate();
                    }
                }

Dies ist geringfügig schneller als eine explizitere Vorabüberprüfung, wenn sich der Wert geändert hat, indem der gewünschte Wert #getTranslationX() verglichen wird, da er JNI-Übergänge minimiert. Der tatsächliche Mechanismus zum Anfordern eines neuen Frames zum Rendern hängt davon ab, wie dieser RenderNode gezeichnet wird. Wenn es wie im obigen Codeausschnitt auf eine enthaltende Ansicht gezeichnet wird, funktioniert dies einfach. Wenn stattdessen der RenderNode direkt auf einen Canvas gezeichnet wird, z. B. mit Surface#lockHardwareCanvas() dem Aufruf eines neuen Frames, das erneute Zeichnen des RenderNode-Stamminhalts oder des gewünschten Inhalts der obersten Ebene und schließlich das Aufrufen eines Surface#unlockCanvasAndPost(Canvas)neuen FramesSurface#lockHardwareCanvas(). </p>

Java Dokumentation für android.graphics.RenderNode.

Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.

Konstruktoren

Name Beschreibung
RenderNode(String)

Erstellt einen neuen RenderNode, der zum Aufzeichnen von Batches von Zeichnungsvorgängen verwendet werden kann, und speichert/wendet Rendereigenschaften beim Zeichnen an.

Eigenschaften

Name Beschreibung
Alpha

Gibt die Transparenzebene dieser Anzeigeliste zurück.

AmbientShadowColor

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

Bottom

Ruft die untere Position für renderNode ab.

CameraDistance

Gibt den Abstand in Z der Kamera für diesen RenderNode zurück.

Class

Gibt die Laufzeitklasse dieses Werts Objectzurück.

(Geerbt von Object)
ClipToBounds

Gibt zurück, ob renderNode an die Grenzen schneidet oder nicht.

ClipToOutline

Siehe #setClipToOutline(boolean).

Elevation

Siehe #setElevation(float).

Handle

Das Handle für die zugrunde liegende Android-Instanz.

(Geerbt von Object)
HasDisplayList

Gibt zurück, ob renderNode über eine Anzeigeliste verfügt.

HasIdentityMatrix

Gibt an, ob der RenderNode über eine Identitätstransformation verfügt.

HasOverlappingRendering

Gibt an, ob sich der Inhalt dieser Anzeigeliste überlappt.

HasShadow

Überprüft, ob der RenderNode einen Schatten aufweist.

Height

Ruft die Höhe des RenderNode ab, die unten - oben.

IsForceDarkAllowed

Siehe #setForceDarkAllowed(boolean).

IsPivotExplicitlySet

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

JniIdentityHashCode

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
JniPeerMembers

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

Left

Ruft die linke Position für renderNode ab.

PeerReference

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
PivotX

Gibt den Pivotwert für diese Anzeigeliste auf der X-Achse in Pixel zurück.

PivotY

Gibt den Pivotwert für diese Anzeigeliste auf der Y-Achse in Pixel zurück.

Right

Ruft die richtige Position für den RenderNode ab.

RotationX

Gibt den Drehungswert für diese Anzeigeliste um die X-Achse in Grad zurück.

RotationY

Gibt den Drehungswert für diese Anzeigeliste um die Y-Achse in Grad zurück.

RotationZ

Gibt den Drehungswert für diese Anzeigeliste um die Z-Achse in Grad zurück.

ScaleX

Gibt den Skalierungswert für diese Anzeigeliste auf der X-Achse zurück.

ScaleY

Gibt den Skalierungswert für diese Anzeigeliste auf der Y-Achse zurück.

SpotShadowColor

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

ThresholdClass

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Object)
ThresholdType

Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Object)
Top

Ruft die oberste Position für renderNode ab.

TranslationX

Gibt den Übersetzungswert für diese Anzeigeliste auf der X-Achse in Pixel zurück.

TranslationY

Gibt den Übersetzungswert für diese Anzeigeliste auf der Y-Achse in Pixel zurück.

TranslationZ

Gibt den Übersetzungswert für diese Anzeigeliste auf der Z-Achse zurück.

UniqueId

Gibt die eindeutige ID zurück, die diesen RenderNode identifiziert.

UseCompositingLayer

Ruft ab, ob eine Compositingschicht verwendet werden muss.

Width

Ruft die Breite des RenderNode ab, die rechts - links ist.

Methoden

Name Beschreibung
BeginRecording()

Identisch mit #beginRecording(int, int) der Breite und Höhe, die auf die eigene Breite und Höhe von RenderNode festgelegt ist.

BeginRecording(Int32, Int32)

Startet die Aufzeichnung einer Anzeigeliste für den Renderknoten.

Clone()

Erstellt und gibt eine Kopie dieses Objekts zurück.

(Geerbt von Object)
ComputeApproximateMemoryUsage()

Ruft die ungefähre Speicherauslastung des RenderNode für Debugzwecke ab.

DiscardDisplayList()

Setzen Sie systemeigene Ressourcen zurück.

Dispose()

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
Dispose(Boolean)

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
EndRecording()

' Beendet die Aufzeichnung für diese Anzeigeliste.

Equals(Object)

Gibt an, ob ein anderes Objekt "gleich" diesem Objekt ist.

(Geerbt von Object)
GetHashCode()

Gibt einen Hashcodewert für das Objekt zurück.

(Geerbt von Object)
GetInverseMatrix(Matrix)

Ruft die aktuelle Transformation invertiert ab.

GetMatrix(Matrix)

Ruft die aktuelle Transformationsmatrix ab.

JavaFinalize()

Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind.

(Geerbt von Object)
Notify()

Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet.

(Geerbt von Object)
NotifyAll()

Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten.

(Geerbt von Object)
OffsetLeftAndRight(Int32)

Versetzt die linken und rechten Positionen für renderNode

OffsetTopAndBottom(Int32)

Versetzt die obersten und untersten Werte für renderNode

ResetPivot()

Löscht alle Pivots, die zuvor durch einen Aufruf #setPivotX(float) oder #setPivotY(float).

SetAlpha(Single)

Legt die Transparenzebene für die Anzeigeliste fest.

SetAmbientShadowColor(Color)

Legt die Farbe des Umgebungsschatten fest, der gezeichnet wird, wenn der RenderNode einen positiven Z- oder Höhenwert aufweist und innerhalb eines Canvas#enableZ() Abschnitts gezeichnet wird.

SetCameraDistance(Single)

Legt den Abstand entlang der Z-Achse (orthogonal zur X/Y-Ebene, auf der RenderNodes gezeichnet werden) von der Kamera zu diesem RenderNode fest.

SetClipRect(Rect)

Legt einen zusätzlichen Clip für renderNode fest.

SetClipToBounds(Boolean)

Legen Sie fest, ob sich der Renderknoten selbst an seine Grenzen ausschneiden soll.

SetClipToOutline(Boolean)

Aktiviert oder deaktiviert den Clipping an die Gliederung.

SetElevation(Single)

Legt die Basiserweiterung dieses RenderNodes in Pixeln fest.

SetForceDarkAllowed(Boolean)

Legt fest, ob erzwungen werden soll, dass dunkel auf diesen RenderNode angewendet wird.

SetHandle(IntPtr, JniHandleOwnership)

Legt die Handle-Eigenschaft fest.

(Geerbt von Object)
SetHasOverlappingRendering(Boolean)

Legt fest, ob die Anzeigeliste Inhalte rendert, die sich überlappen.

SetOutline(Outline)

Legt die Kontur fest, definiert die Form, die einen Schatten umgibt, und den Pfad, der abgeschnitten werden soll, wenn setClipToOutline festgelegt ist.

SetPivotX(Single)

Legt den Pivotwert für die Anzeigeliste auf der X-Achse fest.

SetPivotY(Single)

Legt den Pivotwert für die Anzeigeliste auf der Y-Achse fest.

SetPosition(Int32, Int32, Int32, Int32)

Legt die Position des RenderNode fest.

SetPosition(Rect)

Legt die Position des RenderNode fest.

SetProjectBackwards(Boolean)

Legt fest, ob renderNode unmittelbar nach dem nächstgelegenen Vorgänger renderNode gezeichnet werden soll, der einen Projektionsempfänger enthält.

SetProjectionReceiver(Boolean)

Legt fest, ob renderNode ein Projektionsempfänger ist.

SetRenderEffect(RenderEffect)

Konfigurieren Sie die android.graphics.RenderEffect anwendung auf diesen RenderNode.

SetRotationX(Single)

Legt den Drehungswert für die Anzeigeliste um die X-Achse fest.

SetRotationY(Single)

Legt den Drehungswert für die Anzeigeliste um die Y-Achse fest.

SetRotationZ(Single)

Legt den Drehungswert für die Anzeigeliste um die Z-Achse fest.

SetScaleX(Single)

Legt den Skalierungswert für die Anzeigeliste auf der X-Achse fest.

SetScaleY(Single)

Legt den Skalierungswert für die Anzeigeliste auf der Y-Achse fest.

SetSpotShadowColor(Color)

Legt die Farbe des Spotschatten fest, der gezeichnet wird, wenn der RenderNode einen positiven Z- oder Höhenwert aufweist und innerhalb eines Canvas#enableZ() Abschnitts gezeichnet wird.

SetTranslationX(Single)

Legt den Übersetzungswert für die Anzeigeliste auf der X-Achse fest.

SetTranslationY(Single)

Legt den Übersetzungswert für die Anzeigeliste auf der Y-Achse fest.

SetTranslationZ(Single)

Legt den Übersetzungswert für die Anzeigeliste auf der Z-Achse fest.

SetUseCompositingLayer(Boolean, Paint)

Steuert, ob dieses RenderNode-Objekt in einem Zwischenpuffer gerendert werden soll.

ToArray<T>()

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des Objekts zurück.

(Geerbt von Object)
UnregisterFromRuntime()

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
Wait()

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em> oder <em>unterbrochen</em>.<><

(Geerbt von Object)
Wait(Int64, Int32)

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)
Wait(Int64)

Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist.

(Geerbt von Object)

Explizite Schnittstellenimplementierungen

Name Beschreibung
IJavaPeerable.Disposed()

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
IJavaPeerable.DisposeUnlessReferenced()

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
IJavaPeerable.Finalized()

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
IJavaPeerable.JniManagedPeerState

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

(Geerbt von Object)

Erweiterungsmethoden

Name Beschreibung
GetJniTypeName(IJavaPeerable)

Ruft den JNI-Namen des Typs der Instanz selfab.

JavaAs<TResult>(IJavaPeerable)

Versuchen Sie, die Eingabe TResultzu self erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

JavaCast<TResult>(IJavaObject)

Führt eine android-laufzeitgecheckte Typkonvertierung aus.

JavaCast<TResult>(IJavaObject)

RenderNode wird verwendet, um hardwarebeschleunigte Renderinghierarchien zu erstellen.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Versuchen Sie, die Eingabe TResultzu self erzwingen, und überprüfen Sie, ob die Koersion auf der Java Seite gültig ist.

Gilt für: