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>
可以使用 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 |
返回此 |
| 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 的 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) |
配置 |
| 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, 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) |
获取实例 |
| JavaAs<TResult>(IJavaPeerable) |
尝试强制 |
| JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
| JavaCast<TResult>(IJavaObject) |
RenderNode 用于生成硬件加速呈现层次结构。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
尝试强制 |