RenderNode 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
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 中。 因此,當使用者插入或刪除字元時,只需重新記錄受影響段落的顯示清單。
<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 |
回傳此 |
| ClipToBounds |
回傳 RenderNode 是否已剪輯到其邊界。 |
| ClipToOutline |
請參閱 |
| Elevation |
請參閱 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| HasDisplayList |
回傳 RenderNode 是否有顯示清單。 |
| HasIdentityMatrix |
RenderNode 是否有身份轉換。 |
| HasOverlappingRendering |
顯示此顯示清單的內容是否重疊。 |
| HasShadow |
檢查 RenderNode 是否有陰影。 |
| Height |
取得 RenderNode 的高度,也就是底部到頂部。 |
| IsForceDarkAllowed |
請參閱 |
| 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(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() |
清除先前由呼叫或 |
| SetAlpha(Single) |
設定顯示清單的半透明程度。 |
| SetAmbientShadowColor(Color) |
設定當 RenderNode 具有正 Z 值或高程值,且繪製於某 |
| 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) |
設定 將其 |
| SetRotationX(Single) |
設定顯示列表的旋轉值繞 X 軸。 |
| SetRotationY(Single) |
設定顯示列表繞 Y 軸旋轉的值。 |
| SetRotationZ(Single) |
設定顯示列表的旋轉值繞 Z 軸。 |
| SetScaleX(Single) |
在 X 軸上設定顯示清單的縮放值。 |
| SetScaleY(Single) |
在 Y 軸設定顯示清單的縮放值。 |
| SetSpotShadowColor(Color) |
設定當 RenderNode 具有正 Z 值或高程值,且繪製於截 |
| 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) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
RenderNode 用於建立硬體加速渲染階層結構。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |