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>

可以使用 绘制 RecordingCanvasRenderNode。 软件不支持它们。 始终确保 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>在视图中<绘制 RenderNode/h3>

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>Properties</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 动画。 合并后,可实现最终所需的 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 的转换矩阵。 因此,调用属性资源库的顺序不会影响结果。 也就是说:

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

等效于:

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

<h3>线程</h3>

可以在任何线程上创建和使用 RenderNode,但它们不是线程安全的。 在任何给定时间,只有单个线程可以与 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 直接绘制到 Canvas(例如使用 Surface#lockHardwareCanvas() ),则需要通过调用 Surface#lockHardwareCanvas()来绘制新框架,重新绘制根 RenderNode 或任何所需的顶级内容,最后调用 Surface#unlockCanvasAndPost(Canvas)。 </p>

android.graphics.RenderNodeJava 文档。

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

构造函数

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

(继承自 Object)
Wait(Int64)

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

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

导致当前线程等待,直到它被唤醒,通常是通过 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)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

RenderNode 用于生成硬件加速呈现层次结构。

GetJniTypeName(IJavaPeerable)

RenderNode 用于生成硬件加速呈现层次结构。

适用于