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>

可以使用 /&a0> 绘制 RenderNodes。 软件不支持它们。 始终确保 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 与自定义视图配合使用时,必须仅从 UI 线程使用 RenderNode。

<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 的方式。 如果它被绘制到包含的视图(如上面的代码片段中所示),则只需使该视图失效即可。 相反,如果 RenderNode 直接绘制到画布,例如 Surface#lockHardwareCanvas() ,需要通过调用 Surface#lockHardwareCanvas()来绘制新框架,重新绘制根 RenderNode 或任何顶级内容,最后调用 Surface#unlockCanvasAndPost(Canvas)。 </p>

Java文档android.graphics.RenderNode

本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。

构造函数

名称 说明
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 支持 Mono for Android 基础结构,不打算直接从代码使用。

(继承自 Object)
ThresholdType

此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。

(继承自 Object)
Top

获取 RenderNode 的顶部位置。

TranslationX

返回 X 轴上此显示列表(以像素为单位)的翻译值。

TranslationY

返回 Y 轴上此显示列表的翻译值(以像素为单位)。

TranslationZ

返回 Z 轴上此显示列表的翻译值。

UniqueId

返回标识此 RenderNode 的唯一 ID。

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 的 X/Y 平面)到此 RenderNode。

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

(继承自 Object)
Wait(Int64, Int32)

使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted</em>>,或直到经过一定数量的实时。

(继承自 Object)
Wait(Int64)

使当前线程等待直到唤醒,通常是通过 <em>通知</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)

扩展方法

名称 说明
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端有效。

适用于