final ViewGroup parent = (ViewGroup) mView.getParent();
setGhostedVisibility(View.INVISIBLE);
parent.mRecreateDisplayList = true;
- parent.updateDisplayListIfDirty();
+ parent.getDisplayList();
}
@Override
if (canvas instanceof DisplayListCanvas) {
DisplayListCanvas dlCanvas = (DisplayListCanvas) canvas;
mView.mRecreateDisplayList = true;
- RenderNode renderNode = mView.updateDisplayListIfDirty();
+ RenderNode renderNode = mView.getDisplayList();
if (renderNode.isValid()) {
dlCanvas.insertReorderBarrier(); // enable shadow for this rendernode
dlCanvas.drawRenderNode(renderNode);
final ViewGroup parent = (ViewGroup) mView.getParent();
if (parent != null) {
parent.mRecreateDisplayList = true;
- parent.updateDisplayListIfDirty();
+ parent.getDisplayList();
}
}
}
view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED)
== View.PFLAG_INVALIDATED;
view.mPrivateFlags &= ~View.PFLAG_INVALIDATED;
- view.updateDisplayListIfDirty();
+ view.getDisplayList();
view.mRecreateDisplayList = false;
}
callbacks.onHardwarePreDraw(canvas);
canvas.insertReorderBarrier();
- canvas.drawRenderNode(view.updateDisplayListIfDirty());
+ canvas.drawRenderNode(view.getDisplayList());
canvas.insertInorderBarrier();
callbacks.onHardwarePostDraw(canvas);
return !(mAttachInfo == null || mAttachInfo.mHardwareRenderer == null);
}
- RenderNode updateDisplayListIfDirty() {
+ private void updateDisplayListIfDirty() {
final RenderNode renderNode = mRenderNode;
if (!canHaveDisplayList()) {
// can't populate RenderNode, don't try
- return renderNode;
+ return;
}
if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
dispatchGetDisplayList();
- return renderNode; // no work needed
+ return; // no work needed
}
// If we got here, we're recreating it. Mark it as such to ensure that
mPrivateFlags |= PFLAG_DRAWN | PFLAG_DRAWING_CACHE_VALID;
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
}
- return renderNode;
+ }
+
+ /**
+ * Returns a RenderNode with View draw content recorded, which can be
+ * used to draw this view again without executing its draw method.
+ *
+ * @return A RenderNode ready to replay, or null if caching is not enabled.
+ *
+ * @hide
+ */
+ public RenderNode getDisplayList() {
+ updateDisplayListIfDirty();
+ return mRenderNode;
}
private void resetDisplayList() {
if (drawingWithRenderNode) {
// Delay getting the display list until animation-driven alpha values are
// set up and possibly passed on to the view
- renderNode = updateDisplayListIfDirty();
+ renderNode = getDisplayList();
if (!renderNode.isValid()) {
// Uncommon, but possible. If a view is removed from the hierarchy during the call
// to getDisplayList(), the display list will be marked invalid and we should not
}
private void recreateChildDisplayList(View child) {
- child.mRecreateDisplayList = (child.mPrivateFlags & PFLAG_INVALIDATED) != 0;
+ child.mRecreateDisplayList = (child.mPrivateFlags & PFLAG_INVALIDATED)
+ == PFLAG_INVALIDATED;
child.mPrivateFlags &= ~PFLAG_INVALIDATED;
- child.updateDisplayListIfDirty();
+ child.getDisplayList();
child.mRecreateDisplayList = false;
}
* @hide
*/
void outputDisplayList(View view) {
- RenderNode renderNode = view.updateDisplayListIfDirty();
+ RenderNode renderNode = view.getDisplayList();
if (renderNode != null) {
renderNode.output();
}