RenderNode 類別

定義

RenderNode 用於建立硬體加速渲染階層結構。

[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
繼承
RenderNode
屬性

備註

RenderNode 用於建立硬體加速渲染階層結構。 每個 RenderNode 包含顯示清單以及一組影響顯示清單渲染的屬性。 渲染節點預設用於所有檢視,通常不會直接使用。

RenderNode 用於將複雜場景的渲染內容拆分成較小的部分,然後可以更便宜地逐個更新。 更新場景的一部分只需要更新少數 RenderNode 的顯示清單或屬性,而不是從頭重新繪製。 RenderNode 只有在內容本身應該被更改時,才需要重新錄製顯示清單。 渲染節點也可以在不透過轉換屬性重新錄製顯示清單的情況下進行轉換。

例如,文字編輯器可能會將每個段落儲存在獨立的 RenderNode 中。 因此,當使用者插入或刪除字元時,只需重新記錄受影響段落的顯示清單。

<h3>硬體加速</h3>

渲染節點可以用 RecordingCanvas. 軟體不支援這些功能。 務必確保你用來渲染顯示清單的設備 android.graphics.Canvas 是透過 android.graphics.Canvas#isHardwareAccelerated()硬體加速的。

<h3>建立 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>在 view</h3 中繪製 RenderNode>

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>釋放資源</h3>

此步驟非強制,但建議若想盡快釋出展示清單中保存的資源。 最重要的是,它可能包含的任何點陣圖。

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

<h3>性質</h3>

此外,RenderNode 提供多種屬性,例如 #setScaleX(float)#setTranslationX(float),可用來影響其中記錄的所有繪圖指令。 例如,這些屬性可以用來移動大量影像,而不必重新發出所有個別 canvas.drawBitmap() 呼叫。

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();
                }

有些性質乍看之下可能顯得多餘,例如 #setElevation(float)#setTranslationZ(float)。 這些重複的原因是為了區分靜態與暫態使用。 舉例來說,假設一個按鍵按下時會從 2dp 升到 8dp。 為了達成此目標,應用程式可能會決定設定 Elevation(2dip),然後按下按鈕將 setTranslationZ 動畫化為 6dip。 合起來可達成最終想要的 8 dip 值,但動畫只需專注於從壓起動作起動作,無需知道初始起始值。 #setTranslationX(float) #setTranslationY(float)儘管與 #setPosition(Rect)功能重疊,仍同樣提供用於動畫。

RenderNode 的轉換矩陣在渲染時計算方式如下:

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());

目前畫布的轉換矩陣會被轉換到 RenderNode 的位置,然後乘以 RenderNode 的轉換矩陣。 因此,呼叫屬性設定器的排序不會影響結果。 也就是說:

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

相當於:

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

<h3>線程</h3>

RenderNode 可以在任何執行緒上建立並使用,但它們並非執行緒安全。 任何時候,只有一個執行緒可以與 RenderNode 互動。 RenderNode 必須只在繪製的執行緒上使用。 例如,使用 RenderNode 搭配自訂檢視時,該 RenderNode 必須只能從 UI 執行緒中使用。

<h3>何時重新渲染</h3>

許多 RenderNode 的變音方法,例如 #setTranslationX(float),會回傳一個布林值,指示值是否實際改變。 這有助於判斷是否需要渲染新的幀。 典型的用法如下:

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

這比起直接比較期望值 #getTranslationX() 與 JNI 轉換來做更明確的檢查速度略快,因為這樣可以最小化 JNI 轉換。 實際請求渲染新幀的機制會取決於繪製這個 RenderNode 的方式。 如果它被抽到包含 View 的部分,就像上面那段片段,那麼單純讓 View 無效化是可以的。 如果 RenderNode 是直接繪製到 Canvas,例如 , Surface#lockHardwareCanvas() 則需要透過呼叫 Surface#lockHardwareCanvas()、重新繪製根 RenderNode 或其他頂層內容,最後 Surface#unlockCanvasAndPost(Canvas)呼叫 來繪製新的框架。 </p>

Java 文件 android.graphics.RenderNode

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

建構函式

名稱 Description
RenderNode(String)

建立一個新的 RenderNode,可以用來記錄繪圖作業的批次,並在繪製時儲存/套用渲染屬性。

屬性

名稱 Description
Alpha

回傳此顯示清單的半透明層級。

AmbientShadowColor

RenderNode 用於建立硬體加速渲染階層結構。

Bottom

取得 RenderNode 的最底層位置。

CameraDistance

回傳此 RenderNode 與相機的 Z 距離

Class

回傳此 Object的執行時類別。

(繼承來源 Object)
ClipToBounds

回傳 RenderNode 是否已剪輯到其邊界。

ClipToOutline

請參閱 #setClipToOutline(boolean)

Elevation

請參閱 #setElevation(float)

Handle

底層 Android 實例的帳號。

(繼承來源 Object)
HasDisplayList

回傳 RenderNode 是否有顯示清單。

HasIdentityMatrix

RenderNode 是否有身份轉換。

HasOverlappingRendering

顯示此顯示清單的內容是否重疊。

HasShadow

檢查 RenderNode 是否有陰影。

Height

取得 RenderNode 的高度,也就是底部到頂部。

IsForceDarkAllowed

請參閱 #setForceDarkAllowed(boolean)

IsPivotExplicitlySet

RenderNode 用於建立硬體加速渲染階層結構。

JniIdentityHashCode

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
JniPeerMembers

RenderNode 用於建立硬體加速渲染階層結構。

Left

取得 RenderNode 的左側位置。

PeerReference

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
PivotX

回傳這個顯示清單的樞軸值,以像素為單位。

PivotY

回傳此顯示清單的樞紐值,位於 Y 軸,以像素為單位。

Right

它會得到 RenderNode 的正確位置。

RotationX

回傳此顯示列表繞 X 軸的旋轉值,單位為度數。

RotationY

回傳這個顯示清單中繞 Y 軸的旋轉值,以度數表示。

RotationZ

回傳此顯示列表中繞 Z 軸的旋轉值,單位為度數。

ScaleX

回傳此顯示清單的縮放值,位於 X 軸。

ScaleY

回傳這個顯示清單的縮放值,指向 Y 軸。

SpotShadowColor

RenderNode 用於建立硬體加速渲染階層結構。

ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)
ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)
Top

取得 RenderNode 的頂端位置。

TranslationX

回傳這個顯示列表的 X 軸轉換值,以像素為單位。

TranslationY

回傳這個顯示列表的轉換值,Y軸以像素為單位。

TranslationZ

回傳此顯示列表在 Z 軸的平移值。

UniqueId

回傳識別此 RenderNode 的唯一 ID。

UseCompositingLayer

判斷是否強制使用合成圖層。

Width

取得 RenderNode 的寬度,也就是左右方向。

方法

名稱 Description
BeginRecording()

#beginRecording(int, int)就像寬度和高度設定成 RenderNode 自己的寬度和高度一樣。

BeginRecording(Int32, Int32)

開始為渲染節點錄製顯示清單。

Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
ComputeApproximateMemoryUsage()

取得 RenderNode 的大致記憶體使用量以供除錯。

DiscardDisplayList()

重置原生資源。

Dispose()

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
Dispose(Boolean)

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
EndRecording()

此清單錄影結束。

Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
GetInverseMatrix(Matrix)

讓電流變換反轉。

GetMatrix(Matrix)

得到電流轉換矩陣

JavaFinalize()

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
OffsetLeftAndRight(Int32)

偏移 RenderNode 的左右位置

OffsetTopAndBottom(Int32)

偏移 RenderNode 的頂部與底部值

ResetPivot()

清除先前由呼叫或#setPivotX(float)#setPivotY(float)設定的任何樞軸。

SetAlpha(Single)

設定顯示清單的半透明程度。

SetAmbientShadowColor(Color)

設定當 RenderNode 具有正 Z 值或高程值,且繪製於某 Canvas#enableZ() 個區域時所繪製的環境陰影顏色。

SetCameraDistance(Single)

設定相機與此 RenderNode 沿 Z 軸(與繪製 RenderNode 平面正交)的距離。

SetClipRect(Rect)

在 RenderNode 上設置額外的剪輯。

SetClipToBounds(Boolean)

設定渲染節點是否應該將自己裁剪到其範圍。

SetClipToOutline(Boolean)

啟用或停用對輪廓的裁剪。

SetElevation(Single)

設定此 RenderNode 的基底高度(像素單位)

SetForceDarkAllowed(Boolean)

設定是否允許強制暗(force dark)套用到這個 RenderNode。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetHasOverlappingRendering(Boolean)

設定顯示清單是否渲染重疊的內容。

SetOutline(Outline)

設定輪廓,定義投射陰影的形狀,以及如果設定為 setClipToOutline,則要裁剪的路徑。

SetPivotX(Single)

在 X 軸上設定顯示清單的樞軸值

SetPivotY(Single)

在 Y 軸設定顯示清單的樞紐值

SetPosition(Int32, Int32, Int32, Int32)

設定渲染節點的位置。

SetPosition(Rect)

設定渲染節點的位置。

SetProjectBackwards(Boolean)

設定是否應該緊接著最近祖先 RenderNode 後繪製,該 RenderNode 包含投影接收器。

SetProjectionReceiver(Boolean)

設定 RenderNode 是否為投影接收器。

SetRenderEffect(RenderEffect)

設定 將其 android.graphics.RenderEffect 套用到這個 RenderNode。

SetRotationX(Single)

設定顯示列表的旋轉值繞 X 軸。

SetRotationY(Single)

設定顯示列表繞 Y 軸旋轉的值。

SetRotationZ(Single)

設定顯示列表的旋轉值繞 Z 軸。

SetScaleX(Single)

在 X 軸上設定顯示清單的縮放值。

SetScaleY(Single)

在 Y 軸設定顯示清單的縮放值。

SetSpotShadowColor(Color)

設定當 RenderNode 具有正 Z 值或高程值,且繪製於截 Canvas#enableZ() 面內時所繪製的點陰影顏色。

SetTranslationX(Single)

將顯示列表的翻譯值設定在 X 軸上。

SetTranslationY(Single)

在 Y 軸設定顯示列表的平移值。

SetTranslationZ(Single)

在 Z 軸上設定顯示列表的平移值。

SetUseCompositingLayer(Boolean, Paint)

控制是否強制此 RenderNode 渲染到中間緩衝區。

ToArray<T>()

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
ToString()

回傳物件的字串表示。

(繼承來源 Object)
UnregisterFromRuntime()

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

明確介面實作

名稱 Description
IJavaPeerable.Disposed()

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
IJavaPeerable.DisposeUnlessReferenced()

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
IJavaPeerable.Finalized()

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
IJavaPeerable.JniManagedPeerState

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

RenderNode 用於建立硬體加速渲染階層結構。

(繼承來源 Object)

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

RenderNode 用於建立硬體加速渲染階層結構。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於