Share via


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 預設會用於所有檢視的內部,而且通常不會直接使用。

RenderNodes 可用來將複雜場景的轉譯內容分割成較小的片段,然後個別更新成本更高。 更新場景的一部分只需要更新少量 RenderNode 的顯示清單或屬性,而不是從頭重新繪製所有專案。 RenderNode 只需要在單獨變更其內容時重新錄製其顯示清單。 RenderNodes 也可以轉換,而不需透過轉換屬性重新錄製顯示清單。

實例的文字編輯器可能會將每個段落儲存到自己的 RenderNode 中。 因此,當使用者插入或移除字元時,只需要再次記錄受影響段落的顯示清單。

<h3>硬體加速</h3>

RenderNodes 可以使用 繪製 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 引發的按鈕。 若要達到此目的,應用程式可能會決定將 setElevation (2dip) ,然後按下以動畫顯示 setTranslationZ 至 6dip。 結合這可達到最終所需的 8dip 值,但動畫只需要關注從按下的增益動畫,而不需要知道初始起始值。 #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 的轉換矩陣。 因此,呼叫屬性 setter 的順序不會影響結果。 也就是說::

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

相當於:

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

<h3>線程</h3>

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 轉換最小化時,比較所需的值是否變更,比起執行更明確的預先檢查,這會稍微快一點。 要求轉譯新畫面的實際機制將取決於繪製此 RenderNode 的方式。 如果繪製到包含的 View,如上述代碼段中所示,則只要使該 View 失效即可運作。 如果改為將 RenderNode 直接繪製到 Canvas,例如 Surface#lockHardwareCanvas() ,則需要呼叫 Surface#lockHardwareCanvas()來繪製新的框架,重新繪製根 RenderNode 或任何最上層內容,最後呼叫 Surface#unlockCanvasAndPost(Canvas)。 </p>

android.graphics.RenderNodeJava 檔。

此頁面的部分是根據 所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。

建構函式

RenderNode(String)

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

屬性

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

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

PivotY

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

Right

取得 RenderNode 的正確位置。

RotationX

傳回這個顯示清單繞 X 軸的旋轉值,以度為單位。

RotationY

傳回此顯示清單繞 Y 軸的旋轉值,以度為單位。

RotationZ

傳回這個顯示清單繞 Z 軸的旋轉值,以度為單位。

ScaleX

傳回 X 軸上這個顯示清單的刻度值。

ScaleY

傳回 Y 軸上此顯示清單的刻度值。

SpotShadowColor

RenderNode 可用來建置硬體加速轉譯階層。

ThresholdClass

此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。

(繼承來源 Object)
ThresholdType

此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。

(繼承來源 Object)
Top

取得 RenderNode 的最上層位置。

TranslationX

傳回 X 軸上這個顯示清單的轉譯值,以像素為單位。

TranslationY

傳回 Y 軸上這個顯示清單的轉譯值,以像素為單位。

TranslationZ

傳回 Z 軸上這個顯示清單的轉譯值。

UniqueId

傳回可識別此 RenderNode 的唯一標識碼。

UseCompositingLayer

取得是否強制使用組合層。

Width

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

方法

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)

將沿著 Z 軸 (正交的距離設定為從相機繪製 RenderNode) 到這個 RenderNode 的 X/Y 平面。

SetClipRect(Rect)

在 RenderNode 上設定其他剪輯。

SetClipToBounds(Boolean)

設定轉譯節點是否應該將本身裁剪為其界限。

SetClipToOutline(Boolean)

啟用或停用裁剪至外框。

SetElevation(Single)

以像素為單位設定這個 RenderNode 的基底高度

SetForceDarkAllowed(Boolean)

設定是否允許強制深色套用至這個 RenderNode。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetHasOverlappingRendering(Boolean)

設定顯示清單是否呈現重疊的內容。

SetOutline(Outline)

設定外框、定義轉換陰影的圖形,以及設定 setClipToOutline 時要裁剪的路徑。

SetPivotX(Single)

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

SetPivotY(Single)

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

SetPosition(Int32, Int32, Int32, Int32)

設定 RenderNode 的位置。

SetPosition(Rect)

設定 RenderNode 的位置。

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 <notified/em>或<em>interrupted</em>。><

(繼承來源 Object)
Wait(Int64)

讓目前的線程等到喚醒為止,通常是em <notified/em>或<em>interrupted</em>,或直到經過一定數量的實時為止。<>

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

讓目前的線程等到喚醒為止,通常是em <notified/em>或<em>interrupted</em>,或直到經過一定數量的實時為止。<>

(繼承來源 Object)

明確介面實作

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)

擴充方法

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

RenderNode 可用來建置硬體加速轉譯階層。

GetJniTypeName(IJavaPeerable)

RenderNode 可用來建置硬體加速轉譯階層。

適用於