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 預設會用於所有檢視的內部,而且通常不會直接使用。
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.RenderNode
Java 檔。
此頁面的部分是根據 所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。
建構函式
RenderNode(String) |
建立可用來記錄繪圖作業批次的新 RenderNode,並在繪製時儲存/套用轉譯屬性。 |
屬性
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 |
傳回 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(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) |
將沿著 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) |
|
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 <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 可用來建置硬體加速轉譯階層。 |