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>
可以使用 绘制 RecordingCanvas
RenderNode。 软件不支持它们。 始终确保 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.RenderNode
Java 文档。
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
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 支持 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(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 <通知/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 用于生成硬件加速呈现层次结构。 |