summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2019-02-20 17:39:52 -0800
committerJohn Reck <jreck@google.com>2019-02-22 14:24:28 -0800
commite57475e6c9bf1ba463b51f5214c8d9f1c794070d (patch)
treed7b12f0258d35ae2f880ff76da5c3e73691bd24f
parentab5938c3077371d1770d87316342526e28cadacb (diff)
Address API council feedback
Bug: 125027187 Bug: 125026102 Bug: 125026678 Bug: 125026234 Bug: 125027586 Bug: 125026476 Bug: 125026103 Bug: 125026237 Bug: 125027248 Bug: 125026475 Bug: 125027487 Test: RenderNodeTests Change-Id: Ic63ea7a3cfe359a7dff0c1b46e534e499f7e928b
-rw-r--r--apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java4
-rw-r--r--apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java18
-rw-r--r--apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java8
-rw-r--r--api/current.txt31
-rw-r--r--core/java/android/view/Surface.java4
-rw-r--r--core/java/android/view/ThreadedRenderer.java2
-rw-r--r--core/java/android/view/View.java10
-rw-r--r--core/java/android/view/ViewDebug.java4
-rw-r--r--core/java/android/view/ViewPropertyAnimator.java4
-rw-r--r--core/java/android/view/ViewRootImpl.java2
-rw-r--r--core/java/android/widget/Editor.java4
-rw-r--r--core/java/android/widget/Magnifier.java15
-rw-r--r--core/java/com/android/internal/policy/BackdropFrameRenderer.java8
-rw-r--r--graphics/java/android/graphics/Bitmap.java2
-rw-r--r--graphics/java/android/graphics/HardwareRenderer.java2
-rw-r--r--graphics/java/android/graphics/RecordingCanvas.java2
-rw-r--r--graphics/java/android/graphics/RenderNode.java257
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java2
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/MyLittleTextureView.java4
19 files changed, 238 insertions, 145 deletions
diff --git a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
index e7fe235e0ea8..e805ab912fc1 100644
--- a/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
+++ b/apct-tests/perftests/core/src/android/graphics/perftests/RenderNodePerfTest.java
@@ -71,7 +71,7 @@ public class RenderNodePerfTest {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
RenderNode node = RenderNode.create("LinearLayout", null);
while (state.keepRunning()) {
- node.startRecording(100, 100);
+ node.beginRecording(100, 100);
node.endRecording();
}
}
@@ -86,7 +86,7 @@ public class RenderNodePerfTest {
while (state.keepRunning()) {
for (int i = 0; i < nodes.length; i++) {
- nodes[i].startRecording(100, 100);
+ nodes[i].beginRecording(100, 100);
}
for (int i = nodes.length - 1; i >= 0; i--) {
nodes[i].endRecording();
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
index bd7522d0359e..8a6c60f44702 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
@@ -265,7 +265,7 @@ public class StaticLayoutPerfTest {
state.pauseTiming();
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
@@ -282,7 +282,7 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
@@ -299,7 +299,7 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
@@ -316,7 +316,7 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
@@ -334,7 +334,7 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
@@ -353,7 +353,7 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
@@ -371,7 +371,7 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
@@ -389,7 +389,7 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
@@ -408,7 +408,7 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
- final RecordingCanvas c = node.startRecording(1200, 200);
+ final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java
index 0bc9ee4e53ab..55d54e452040 100644
--- a/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java
+++ b/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java
@@ -344,7 +344,7 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
- final RecordingCanvas c = node.startRecording(
+ final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
@@ -371,7 +371,7 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
- final RecordingCanvas c = node.startRecording(
+ final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
@@ -400,7 +400,7 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
- final RecordingCanvas c = node.startRecording(
+ final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
@@ -430,7 +430,7 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
- final RecordingCanvas c = node.startRecording(
+ final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
diff --git a/api/current.txt b/api/current.txt
index 2b560a4de7ae..6ef2d6b850f9 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -14936,13 +14936,15 @@ package android.graphics {
public final class RenderNode {
ctor public RenderNode(@Nullable String);
- method public int computeApproximateMemoryUsage();
+ method public android.graphics.RecordingCanvas beginRecording(int, int);
+ method public android.graphics.RecordingCanvas beginRecording();
+ method public long computeApproximateMemoryUsage();
method public void discardDisplayList();
method public void endRecording();
method public float getAlpha();
- method public int getAmbientShadowColor();
+ method @ColorInt public int getAmbientShadowColor();
method public int getBottom();
- method public float getCameraDistance();
+ method @FloatRange(from=0.0f, to=java.lang.Float.MAX_VALUE) public float getCameraDistance();
method public boolean getClipToBounds();
method public boolean getClipToOutline();
method public float getElevation();
@@ -14953,12 +14955,12 @@ package android.graphics {
method public float getPivotX();
method public float getPivotY();
method public int getRight();
- method public float getRotation();
method public float getRotationX();
method public float getRotationY();
+ method public float getRotationZ();
method public float getScaleX();
method public float getScaleY();
- method public int getSpotShadowColor();
+ method @ColorInt public int getSpotShadowColor();
method public int getTop();
method public float getTranslationX();
method public float getTranslationY();
@@ -14976,36 +14978,31 @@ package android.graphics {
method public boolean offsetTopAndBottom(int);
method public boolean resetPivot();
method public boolean setAlpha(float);
- method public boolean setAmbientShadowColor(int);
- method public boolean setBottom(int);
- method public boolean setCameraDistance(float);
- method public boolean setClipBounds(@Nullable android.graphics.Rect);
+ method public boolean setAmbientShadowColor(@ColorInt int);
+ method public boolean setCameraDistance(@FloatRange(from=0.0f, to=java.lang.Float.MAX_VALUE) float);
+ method public boolean setClipRect(@Nullable android.graphics.Rect);
method public boolean setClipToBounds(boolean);
method public boolean setClipToOutline(boolean);
method public boolean setElevation(float);
method public boolean setForceDarkAllowed(boolean);
method public boolean setHasOverlappingRendering(boolean);
- method public boolean setLeft(int);
- method public boolean setLeftTopRightBottom(int, int, int, int);
method public boolean setOutline(@Nullable android.graphics.Outline);
method public boolean setPivotX(float);
method public boolean setPivotY(float);
+ method public boolean setPosition(int, int, int, int);
+ method public boolean setPosition(android.graphics.Rect);
method public boolean setProjectBackwards(boolean);
method public boolean setProjectionReceiver(boolean);
- method public boolean setRight(int);
- method public boolean setRotation(float);
method public boolean setRotationX(float);
method public boolean setRotationY(float);
+ method public boolean setRotationZ(float);
method public boolean setScaleX(float);
method public boolean setScaleY(float);
- method public boolean setSpotShadowColor(int);
- method public boolean setTop(int);
+ method public boolean setSpotShadowColor(@ColorInt int);
method public boolean setTranslationX(float);
method public boolean setTranslationY(float);
method public boolean setTranslationZ(float);
method public boolean setUseCompositingLayer(boolean, @Nullable android.graphics.Paint);
- method public android.graphics.RecordingCanvas startRecording(int, int);
- method public android.graphics.RecordingCanvas startRecording();
}
public class Shader {
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index d0194f990148..a15a20a58abb 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -922,7 +922,7 @@ public class Surface implements Parcelable {
if (mCanvas != null) {
throw new IllegalStateException("Surface was already locked!");
}
- mCanvas = mRenderNode.start(width, height);
+ mCanvas = mRenderNode.beginRecording(width, height);
return mCanvas;
}
@@ -931,7 +931,7 @@ public class Surface implements Parcelable {
throw new IllegalArgumentException("canvas object must be the same instance that "
+ "was previously returned by lockCanvas");
}
- mRenderNode.end(mCanvas);
+ mRenderNode.endRecording();
mCanvas = null;
nHwuiDraw(mHwuiRenderer);
}
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 20978127f510..3d3d5dc7db32 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -590,7 +590,7 @@ public final class ThreadedRenderer extends HardwareRenderer {
}
if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) {
- RecordingCanvas canvas = mRootNode.startRecording(mSurfaceWidth, mSurfaceHeight);
+ RecordingCanvas canvas = mRootNode.beginRecording(mSurfaceWidth, mSurfaceHeight);
try {
final int saveCount = canvas.save();
canvas.translate(mInsetLeft, mInsetTop);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a78f2b073a3a..e65043e3b70d 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -16043,7 +16043,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@ViewDebug.ExportedProperty(category = "drawing")
@InspectableProperty
public float getRotation() {
- return mRenderNode.getRotation();
+ return mRenderNode.getRotationZ();
}
/**
@@ -16064,7 +16064,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (rotation != getRotation()) {
// Double-invalidation is necessary to capture view's old and new areas
invalidateViewProperty(true, false);
- mRenderNode.setRotation(rotation);
+ mRenderNode.setRotationZ(rotation);
invalidateViewProperty(false, true);
invalidateParentIfNeededAndWasQuickRejected();
@@ -20578,7 +20578,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
int height = mBottom - mTop;
int layerType = getLayerType();
- final RecordingCanvas canvas = renderNode.startRecording(width, height);
+ final RecordingCanvas canvas = renderNode.beginRecording(width, height);
try {
if (layerType == LAYER_TYPE_SOFTWARE) {
@@ -21233,7 +21233,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
} else {
mClipBounds = null;
}
- mRenderNode.setClipBounds(mClipBounds);
+ mRenderNode.setClipRect(mClipBounds);
invalidateViewProperty(false, false);
}
@@ -21978,7 +21978,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
final Rect bounds = drawable.getBounds();
final int width = bounds.width();
final int height = bounds.height();
- final RecordingCanvas canvas = renderNode.startRecording(width, height);
+ final RecordingCanvas canvas = renderNode.beginRecording(width, height);
// Reverse left/top translation done by drawable canvas, which will
// instead be applied by rendernode's LTRB bounds below. This way, the
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 5afc07f35ba0..423a75c7330d 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -611,11 +611,11 @@ public class ViewDebug {
}
if (view.isHardwareAccelerated()) {
- RecordingCanvas canvas = node.start(dm.widthPixels, dm.heightPixels);
+ RecordingCanvas canvas = node.beginRecording(dm.widthPixels, dm.heightPixels);
try {
return profileViewOperation(view, () -> view.draw(canvas));
} finally {
- node.end(canvas);
+ node.endRecording();
}
} else {
Bitmap bitmap = Bitmap.createBitmap(
diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java
index 68c0d9ec465b..afee1e5cf7f4 100644
--- a/core/java/android/view/ViewPropertyAnimator.java
+++ b/core/java/android/view/ViewPropertyAnimator.java
@@ -985,7 +985,7 @@ public class ViewPropertyAnimator {
renderNode.setTranslationZ(value);
break;
case ROTATION:
- renderNode.setRotation(value);
+ renderNode.setRotationZ(value);
break;
case ROTATION_X:
renderNode.setRotationX(value);
@@ -1031,7 +1031,7 @@ public class ViewPropertyAnimator {
case TRANSLATION_Z:
return node.getTranslationZ();
case ROTATION:
- return node.getRotation();
+ return node.getRotationZ();
case ROTATION_X:
return node.getRotationX();
case ROTATION_Y:
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index b1fee2d17079..cbcb614515fd 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -7080,7 +7080,7 @@ public final class ViewRootImpl implements ViewParent,
RenderNode renderNode = view.mRenderNode;
info[0]++;
if (renderNode != null) {
- info[1] += renderNode.computeApproximateMemoryUsage();
+ info[1] += (int) renderNode.computeApproximateMemoryUsage();
}
if (view instanceof ViewGroup) {
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index ded3be4e4ef5..b6ec5f936fbd 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1947,7 +1947,7 @@ public class Editor {
// Rebuild display list if it is invalid
if (blockDisplayListIsInvalid) {
- final RecordingCanvas recordingCanvas = blockDisplayList.start(
+ final RecordingCanvas recordingCanvas = blockDisplayList.beginRecording(
right - left, bottom - top);
try {
// drawText is always relative to TextView's origin, this translation
@@ -1958,7 +1958,7 @@ public class Editor {
// No need to untranslate, previous context is popped after
// drawDisplayList
} finally {
- blockDisplayList.end(recordingCanvas);
+ blockDisplayList.endRecording();
// Same as drawDisplayList below, handled by our TextView's parent
blockDisplayList.setClipToBounds(false);
}
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 249f49956256..49c01237f2cc 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -859,7 +859,7 @@ public final class Magnifier {
);
setupOverlay();
- final RecordingCanvas canvas = mRenderer.getRootNode().start(width, height);
+ final RecordingCanvas canvas = mRenderer.getRootNode().beginRecording(width, height);
try {
canvas.insertReorderBarrier();
canvas.drawRenderNode(mBitmapRenderNode);
@@ -867,7 +867,7 @@ public final class Magnifier {
canvas.drawRenderNode(mOverlayRenderNode);
canvas.insertInorderBarrier();
} finally {
- mRenderer.getRootNode().end(canvas);
+ mRenderer.getRootNode().endRecording();
}
if (mCallback != null) {
mCurrentContent =
@@ -898,11 +898,12 @@ public final class Magnifier {
bitmapRenderNode.setClipToOutline(true);
// Create a dummy draw, which will be replaced later with real drawing.
- final RecordingCanvas canvas = bitmapRenderNode.start(mContentWidth, mContentHeight);
+ final RecordingCanvas canvas = bitmapRenderNode.beginRecording(
+ mContentWidth, mContentHeight);
try {
canvas.drawColor(0xFF00FF00);
} finally {
- bitmapRenderNode.end(canvas);
+ bitmapRenderNode.endRecording();
}
return bitmapRenderNode;
@@ -954,7 +955,7 @@ public final class Magnifier {
// Draw the drawable to the render node. This happens once during
// initialization and whenever the overlay drawable is invalidated.
final RecordingCanvas canvas =
- mOverlayRenderNode.startRecording(mContentWidth, mContentHeight);
+ mOverlayRenderNode.beginRecording(mContentWidth, mContentHeight);
try {
mOverlay.setBounds(0, 0, mContentWidth, mContentHeight);
mOverlay.draw(canvas);
@@ -1035,7 +1036,7 @@ public final class Magnifier {
}
final RecordingCanvas canvas =
- mBitmapRenderNode.start(mContentWidth, mContentHeight);
+ mBitmapRenderNode.beginRecording(mContentWidth, mContentHeight);
try {
final Rect srcRect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
final Rect dstRect = new Rect(0, 0, mContentWidth, mContentHeight);
@@ -1043,7 +1044,7 @@ public final class Magnifier {
paint.setFilterBitmap(true);
canvas.drawBitmap(mBitmap, srcRect, dstRect, paint);
} finally {
- mBitmapRenderNode.end(canvas);
+ mBitmapRenderNode.endRecording();
}
if (mPendingWindowPositionUpdate || mFirstDraw) {
diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java
index cc958f4ed735..fa737582f7f6 100644
--- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java
+++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java
@@ -339,7 +339,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame
mFrameAndBackdropNode.setLeftTopRightBottom(left, top, left + width, top + height);
// Draw the caption and content backdrops in to our render node.
- RecordingCanvas canvas = mFrameAndBackdropNode.start(width, height);
+ RecordingCanvas canvas = mFrameAndBackdropNode.beginRecording(width, height);
final Drawable drawable = mUserCaptionBackgroundDrawable != null
? mUserCaptionBackgroundDrawable : mCaptionBackgroundDrawable;
@@ -353,7 +353,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame
mResizingBackgroundDrawable.setBounds(0, mLastCaptionHeight, left + width, top + height);
mResizingBackgroundDrawable.draw(canvas);
}
- mFrameAndBackdropNode.end(canvas);
+ mFrameAndBackdropNode.endRecording();
drawColorViews(left, top, width, height, fullscreen, systemInsets, stableInsets);
@@ -368,7 +368,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame
if (mSystemBarBackgroundNode == null) {
return;
}
- RecordingCanvas canvas = mSystemBarBackgroundNode.start(width, height);
+ RecordingCanvas canvas = mSystemBarBackgroundNode.beginRecording(width, height);
mSystemBarBackgroundNode.setLeftTopRightBottom(left, top, left + width, top + height);
final int topInset = DecorView.getColorViewTopInset(mStableInsets.top, mSystemInsets.top);
if (mStatusBarColor != null) {
@@ -384,7 +384,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame
mNavigationBarColor.setBounds(mTmpRect);
mNavigationBarColor.draw(canvas);
}
- mSystemBarBackgroundNode.end(canvas);
+ mSystemBarBackgroundNode.endRecording();
mRenderer.drawRenderNode(mSystemBarBackgroundNode);
}
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 81356710cce6..7ad949db310c 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -1267,7 +1267,7 @@ public final class Bitmap implements Parcelable {
node.setLeftTopRightBottom(0, 0, width, height);
node.setClipToBounds(false);
node.setForceDarkAllowed(false);
- final RecordingCanvas canvas = node.startRecording(width, height);
+ final RecordingCanvas canvas = node.beginRecording(width, height);
if (source.getWidth() != width || source.getHeight() != height) {
canvas.scale(width / (float) source.getWidth(),
height / (float) source.getHeight());
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index b020556cd15f..e6233548651e 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -258,7 +258,7 @@ public class HardwareRenderer {
* and the renderer will draw nothing.
*/
public void setContentRoot(@Nullable RenderNode content) {
- RecordingCanvas canvas = mRootNode.startRecording();
+ RecordingCanvas canvas = mRootNode.beginRecording();
if (content != null) {
canvas.drawRenderNode(content);
}
diff --git a/graphics/java/android/graphics/RecordingCanvas.java b/graphics/java/android/graphics/RecordingCanvas.java
index 515532ffda52..30466e1f6b1f 100644
--- a/graphics/java/android/graphics/RecordingCanvas.java
+++ b/graphics/java/android/graphics/RecordingCanvas.java
@@ -31,7 +31,7 @@ import dalvik.annotation.optimization.FastNative;
* Bitmap objects that it draws, preventing the backing memory of Bitmaps from being released while
* the RecordingCanvas is still holding a native reference to the memory.
*
- * This is obtained by calling {@link RenderNode#startRecording()} and is valid until the matching
+ * This is obtained by calling {@link RenderNode#beginRecording()} and is valid until the matching
* {@link RenderNode#endRecording()} is called. It must not be retained beyond that as it is
* internally reused.
*/
diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java
index 09b18b771250..e98879d0c5bd 100644
--- a/graphics/java/android/graphics/RenderNode.java
+++ b/graphics/java/android/graphics/RenderNode.java
@@ -16,6 +16,9 @@
package android.graphics;
+import android.annotation.BytesLong;
+import android.annotation.ColorInt;
+import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -59,7 +62,7 @@ import java.lang.annotation.RetentionPolicy;
* <pre class="prettyprint">
* RenderNode renderNode = RenderNode.create("myRenderNode");
* renderNode.setLeftTopRightBottom(0, 0, 50, 50); // Set the size to 50x50
- * RecordingCanvas canvas = renderNode.startRecording();
+ * RecordingCanvas canvas = renderNode.beginRecording();
* try {
* // Draw with the canvas
* canvas.drawRect(...);
@@ -71,14 +74,13 @@ import java.lang.annotation.RetentionPolicy;
* <h3>Drawing a RenderNode in a View</h3>
* <pre class="prettyprint">
* protected void onDraw(Canvas canvas) {
- * if (canvas instanceof RecordingCanvas) {
- * RecordingCanvas recordingCanvas = (RecordingCanvas) 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.
- * recordingCanvas.drawRenderNode(myRenderNode);
+ * canvas.drawRenderNode(myRenderNode);
* }
* }
* </pre>
@@ -95,7 +97,7 @@ import java.lang.annotation.RetentionPolicy;
*
* <h3>Properties</h3>
* <p>In addition, a RenderNode offers several properties, such as
- * {@link #setScaleX(float)} or {@link #setLeft(int)}, that can be used to affect all
+ * {@link #setScaleX(float)} or {@link #setTranslationX(float)}, that can be used to affect all
* the drawing commands recorded within. For instance, these properties can be used
* to move around a large number of images without re-issuing all the individual
* <code>canvas.drawBitmap()</code> calls.</p>
@@ -104,7 +106,7 @@ import java.lang.annotation.RetentionPolicy;
* private void createDisplayList() {
* mRenderNode = RenderNode.create("MyRenderNode");
* mRenderNode.setLeftTopRightBottom(0, 0, width, height);
- * RecordingCanvas canvas = mRenderNode.startRecording();
+ * RecordingCanvas canvas = mRenderNode.beginRecording();
* try {
* for (Bitmap b : mBitmaps) {
* canvas.drawBitmap(b, 0.0f, 0.0f, null);
@@ -116,9 +118,8 @@ import java.lang.annotation.RetentionPolicy;
* }
*
* protected void onDraw(Canvas canvas) {
- * if (canvas instanceof RecordingCanvas) {
- * RecordingCanvas recordingCanvas = (RecordingCanvas) canvas;
- * recordingCanvas.drawRenderNode(mRenderNode);
+ * if (canvas.isHardwareAccelerated())
+ * canvas.drawRenderNode(mRenderNode);
* }
* }
*
@@ -263,19 +264,20 @@ public final class RenderNode {
* stored in this display list.
*
* {@link #endRecording()} must be called when the recording is finished in order to apply
- * the updated display list.
+ * the updated display list. Failing to call {@link #endRecording()} will result in an
+ * {@link IllegalStateException} if {@link #beginRecording(int, int)} is called again.
*
* @param width The width of the recording viewport. This will not alter the width of the
- * RenderNode itself, that must be set with {@link #setLeft(int)} and
- * {@link #setRight(int)}
+ * RenderNode itself, that must be set with {@link #setPosition(Rect)}.
* @param height The height of the recording viewport. This will not alter the height of the
- * RenderNode itself, that must be set with {@link #setTop(int)} and
- * {@link #setBottom(int)}.
+ * RenderNode itself, that must be set with {@link #setPosition(Rect)}.
* @return A canvas to record drawing operations.
+ * @throws IllegalStateException If a recording is already in progress. That is, the previous
+ * call to {@link #beginRecording(int, int)} did not call {@link #endRecording()}.
* @see #endRecording()
* @see #hasDisplayList()
*/
- public RecordingCanvas startRecording(int width, int height) {
+ public RecordingCanvas beginRecording(int width, int height) {
if (mCurrentRecordingCanvas != null) {
throw new IllegalStateException(
"Recording currently in progress - missing #endRecording() call?");
@@ -285,21 +287,18 @@ public final class RenderNode {
}
/**
- * Same as {@link #startRecording(int, int)} with the width & height set
+ * Same as {@link #beginRecording(int, int)} with the width & height set
* to the RenderNode's own width & height. The RenderNode's width & height may be set
- * with {@link #setLeftTopRightBottom(int, int, int, int)}.
- */
- public RecordingCanvas startRecording() {
- return startRecording(nGetWidth(mNativeRenderNode), nGetHeight(mNativeRenderNode));
- }
-
- /**
- * @hide
- * @deprecated use {@link #startRecording(int, int)} instead
+ * with {@link #setPosition(int, int, int, int)}.
+ *
+ * @return A canvas to record drawing operations.
+ * @throws IllegalStateException If a recording is already in progress. That is, the previous
+ * call to {@link #beginRecording(int, int)} did not call {@link #endRecording()}.
+ * @see #endRecording()
+ * @see #hasDisplayList()
*/
- @Deprecated
- public RecordingCanvas start(int width, int height) {
- return startRecording(width, height);
+ public RecordingCanvas beginRecording() {
+ return beginRecording(nGetWidth(mNativeRenderNode), nGetHeight(mNativeRenderNode));
}
/**
@@ -307,13 +306,13 @@ public final class RenderNode {
* Ends the recording for this display list. Calling this method marks
* the display list valid and {@link #hasDisplayList()} will return true.
*
- * @see #startRecording(int, int)
+ * @see #beginRecording(int, int)
* @see #hasDisplayList()
*/
public void endRecording() {
if (mCurrentRecordingCanvas == null) {
throw new IllegalStateException(
- "No recording in progress, forgot to call #startRecording()?");
+ "No recording in progress, forgot to call #beginRecording()?");
}
RecordingCanvas canvas = mCurrentRecordingCanvas;
mCurrentRecordingCanvas = null;
@@ -324,13 +323,21 @@ public final class RenderNode {
/**
* @hide
+ * @deprecated use {@link #beginRecording(int, int)} instead
+ */
+ @Deprecated
+ public RecordingCanvas start(int width, int height) {
+ return beginRecording(width, height);
+ }
+
+ /**
+ * @hide
* @deprecated use {@link #endRecording()} instead
*/
@Deprecated
public void end(RecordingCanvas canvas) {
- if (mCurrentRecordingCanvas != canvas) {
- throw new IllegalArgumentException(
- "Canvas given isn't the one that was returned from #startRecording");
+ if (canvas != mCurrentRecordingCanvas) {
+ throw new IllegalArgumentException("Wrong canvas");
}
endRecording();
}
@@ -346,7 +353,7 @@ public final class RenderNode {
/**
* Returns whether the RenderNode has a display list. If this returns false, the RenderNode
- * should be re-recorded with {@link #startRecording()} and {@link #endRecording()}.
+ * should be re-recorded with {@link #beginRecording()} and {@link #endRecording()}.
*
* A RenderNode without a display list may still be drawn, however it will have no impact
* on the rendering content until its display list is updated.
@@ -425,18 +432,21 @@ public final class RenderNode {
* for performance or required for the current combination of {@link #setAlpha(float)} and
* {@link #setHasOverlappingRendering(boolean)}.
*
- * The usage of this is instead to allow for either overriding of the internal behavior
+ * <p>The usage of this is instead to allow for either overriding of the internal behavior
* if it's measured to be necessary for the particular rendering content in question or, more
* usefully, to add a composition effect to the RenderNode via the optional paint parameter.
*
- * Note: When a RenderNode is using a compositing layer it will also result in
+ * <p>Note: When a RenderNode is using a compositing layer it will also result in
* clipToBounds=true behavior.
*
* @param forceToLayer if true this forces the RenderNode to use an intermediate buffer.
* Default & generally recommended value is false.
* @param paint The blend mode, alpha, and ColorFilter to apply to the compositing layer.
- * Only applies if forceToLayer is true.
- * @return true if anything changed, false otherwise
+ * Only applies if forceToLayer is true. The paint's alpha is multiplied
+ * with {@link #getAlpha()} to resolve the final alpha of the RenderNode.
+ * If null then no additional composition effects are applied on top of the
+ * composition layer.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setUseCompositingLayer(boolean forceToLayer, @Nullable Paint paint) {
boolean didChange = nSetLayerType(mNativeRenderNode, forceToLayer ? 2 : 0);
@@ -457,15 +467,22 @@ public final class RenderNode {
}
/**
- * Sets the clip bounds of the RenderNode. If null, the clip bounds is removed from the
- * RenderNode. If non-null, the RenderNode will be clipped to this rect. If
+ * Sets an additional clip on the RenderNode. If null, the extra clip is removed from the
+ * RenderNode. If non-null, the RenderNode will be clipped to this rect. In addition if
* {@link #setClipToBounds(boolean)} is true, then the RenderNode will be clipped to the
- * intersection of this rectangle and the bounds of the render node.
+ * intersection of this rectangle and the bounds of the render node, which is set with
+ * {@link #setPosition(Rect)}.
+ *
+ * <p>This is equivalent to do a {@link Canvas#clipRect(Rect)} at the start of this
+ * RenderNode's display list. However, as this is a property of the RenderNode instead
+ * of part of the display list it can be more easily animated for transient additional
+ * clipping. An example usage of this would be the {@link android.transition.ChangeBounds}
+ * transition animation with the resizeClip=true option.
*
- * @param rect the bounds to clip to. If null, the clip bounds are reset
- * @return True if the clip bounds changed, false otherwise
+ * @param rect the bounds to clip to. If null, the additional clip is removed.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
- public boolean setClipBounds(@Nullable Rect rect) {
+ public boolean setClipRect(@Nullable Rect rect) {
if (rect == null) {
return nSetClipBoundsEmpty(mNativeRenderNode);
} else {
@@ -477,11 +494,12 @@ public final class RenderNode {
* Set whether the Render node should clip itself to its bounds. This defaults to true,
* and is useful to the renderer in enable quick-rejection of chunks of the tree as well as
* better partial invalidation support. Clipping can be further restricted or controlled
- * through the combination of this property as well as {@link #setClipBounds(Rect)}, which
+ * through the combination of this property as well as {@link #setClipRect(Rect)}, which
* allows for a different clipping rectangle to be used in addition to or instead of the
- * {@link #setLeftTopRightBottom(int, int, int, int)} or the RenderNode.
+ * {@link #setPosition(int, int, int, int)} or the RenderNode.
*
* @param clipToBounds true if the display list should clip to its bounds, false otherwise.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setClipToBounds(boolean clipToBounds) {
return nSetClipToBounds(mNativeRenderNode, clipToBounds);
@@ -489,7 +507,7 @@ public final class RenderNode {
/**
* Returns whether or not the RenderNode is clipping to its bounds. See
- * {@link #setClipToBounds(boolean)} and {@link #setLeftTopRightBottom(int, int, int, int)}
+ * {@link #setClipToBounds(boolean)} and {@link #setPosition(int, int, int, int)}
*
* @return true if the render node clips to its bounds, false otherwise.
*/
@@ -498,20 +516,58 @@ public final class RenderNode {
}
/**
- * Sets whether the RenderNode should be drawn immediately after the
+ * <p>Sets whether the RenderNode should be drawn immediately after the
* closest ancestor RenderNode containing a projection receiver.
*
+ * <p>The default is false, and the rendering of this node happens in the typical draw order.
+ *
+ * <p>If true, then at rendering time this rendernode will not be drawn in order with the
+ * {@link Canvas#drawRenderNode(RenderNode)} command that drew this RenderNode, but instead
+ * it will be re-positioned in the RenderNode tree to be drawn on the closet ancestor with a
+ * child rendernode that has {@link #setProjectionReceiver(boolean)} as true.
+ *
+ * <p>The typical usage of this is to allow a child RenderNode to draw on a parent's background,
+ * such as the platform's usage with {@link android.graphics.drawable.RippleDrawable}. Consider
+ * the following structure, built out of which RenderNode called drawRenderNode on a different
+ * RenderNode:
+ *
+ * <pre>
+ * +-------------+
+ * |RenderNode: P|
+ * +-+----------++
+ * | |
+ * v v
+ * +-------+-----+ +-+--------------+
+ * |RenderNode: C| |RenderNode: P'BG|
+ * +-------+-----+ +----------------+
+ * |
+ * |
+ * +--------+-------+
+ * |RenderNode: C'BG|
+ * +----------------+
+ * </pre>
+ *
+ * If P'BG is a projection receiver, and C'BG is set to project backwards then C'BG will
+ * behave as if it was drawn directly by P'BG instead of by C. This includes inheriting P'BG's
+ * clip instead of C's clip.
+ *
* @param shouldProject true if the display list should be projected onto a
- * containing volume.
+ * containing volume. Default is false.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setProjectBackwards(boolean shouldProject) {
return nSetProjectBackwards(mNativeRenderNode, shouldProject);
}
/**
- * Sets whether the RenderNode is a projection receiver - that its parent
- * RenderNode should draw any descendent RenderNodes with
- * ProjectBackwards=true directly on top of it. Default value is false.
+ * Sets whether the RenderNode is a projection receiver. If true then this RenderNode's parent
+ * should draw any descendant RenderNodes with ProjectBackwards=true directly on top of it.
+ * Default value is false. See
+ * {@link #setProjectBackwards(boolean)} for a description of what this entails.
+ *
+ * @param shouldRecieve True if this RenderNode is a projection receiver, false otherwise.
+ * Default is false.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setProjectionReceiver(boolean shouldRecieve) {
return nSetProjectionReceiver(mNativeRenderNode, shouldRecieve);
@@ -526,6 +582,7 @@ public final class RenderNode {
* outline for those changes to be applied.
*
* @param outline The outline to use for this RenderNode.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setOutline(@Nullable Outline outline) {
if (outline == null) {
@@ -572,8 +629,9 @@ public final class RenderNode {
* {@link android.R.attr#spotShadowAlpha} theme attribute
*
* @param color The color this RenderNode will cast for its elevation spot shadow.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
- public boolean setSpotShadowColor(int color) {
+ public boolean setSpotShadowColor(@ColorInt int color) {
return nSetSpotShadowColor(mNativeRenderNode, color);
}
@@ -581,7 +639,7 @@ public final class RenderNode {
* @return The shadow color set by {@link #setSpotShadowColor(int)}, or black if nothing
* was set
*/
- public int getSpotShadowColor() {
+ public @ColorInt int getSpotShadowColor() {
return nGetSpotShadowColor(mNativeRenderNode);
}
@@ -597,8 +655,9 @@ public final class RenderNode {
* {@link android.R.attr#ambientShadowAlpha} theme attribute.
*
* @param color The color this RenderNode will cast for its elevation shadow.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
- public boolean setAmbientShadowColor(int color) {
+ public boolean setAmbientShadowColor(@ColorInt int color) {
return nSetAmbientShadowColor(mNativeRenderNode, color);
}
@@ -606,7 +665,7 @@ public final class RenderNode {
* @return The shadow color set by {@link #setAmbientShadowColor(int)}, or black if
* nothing was set
*/
- public int getAmbientShadowColor() {
+ public @ColorInt int getAmbientShadowColor() {
return nGetAmbientShadowColor(mNativeRenderNode);
}
@@ -614,6 +673,8 @@ public final class RenderNode {
* Enables or disables clipping to the outline.
*
* @param clipToOutline true if clipping to the outline.
+ * @return True if the clipToOutline value changed, false if previous value matched the new
+ * value.
*/
public boolean setClipToOutline(boolean clipToOutline) {
return nSetClipToOutline(mNativeRenderNode, clipToOutline);
@@ -640,7 +701,7 @@ public final class RenderNode {
/**
* Set the static matrix on the display list. The specified matrix is combined with other
- * transforms (such as {@link #setScaleX(float)}, {@link #setRotation(float)}, etc.)
+ * transforms (such as {@link #setScaleX(float)}, {@link #setRotationZ(float)}, etc.)
*
* @param matrix A transform matrix to apply to this display list
* @hide TODO Do we want this?
@@ -669,6 +730,7 @@ public final class RenderNode {
* @param alpha The translucency of the display list, must be a value between 0.0f and 1.0f
* @see View#setAlpha(float)
* @see #getAlpha()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setAlpha(float alpha) {
return nSetAlpha(mNativeRenderNode, alpha);
@@ -742,7 +804,7 @@ public final class RenderNode {
* Sets the base elevation of this RenderNode in pixels
*
* @param lift the elevation in pixels
- * @return true if the elevation changed, false if it was the same
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setElevation(float lift) {
return nSetElevation(mNativeRenderNode, lift);
@@ -763,6 +825,7 @@ public final class RenderNode {
* @param translationX The X axis translation value of the display list, in pixels
* @see View#setTranslationX(float)
* @see #getTranslationX()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setTranslationX(float translationX) {
return nSetTranslationX(mNativeRenderNode, translationX);
@@ -783,6 +846,7 @@ public final class RenderNode {
* @param translationY The Y axis translation value of the display list, in pixels
* @see View#setTranslationY(float)
* @see #getTranslationY()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setTranslationY(float translationY) {
return nSetTranslationY(mNativeRenderNode, translationY);
@@ -802,6 +866,7 @@ public final class RenderNode {
*
* @see View#setTranslationZ(float)
* @see #getTranslationZ()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setTranslationZ(float translationZ) {
return nSetTranslationZ(mNativeRenderNode, translationZ);
@@ -820,19 +885,20 @@ public final class RenderNode {
* Sets the rotation value for the display list around the Z axis.
*
* @param rotation The rotation value of the display list, in degrees
- * @see View#setRotation(float)
- * @see #getRotation()
+ * @see View#setRotationZ(float)
+ * @see #getRotationZ()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
- public boolean setRotation(float rotation) {
+ public boolean setRotationZ(float rotation) {
return nSetRotation(mNativeRenderNode, rotation);
}
/**
* Returns the rotation value for this display list around the Z axis, in degrees.
*
- * @see #setRotation(float)
+ * @see #setRotationZ(float)
*/
- public float getRotation() {
+ public float getRotationZ() {
return nGetRotation(mNativeRenderNode);
}
@@ -842,6 +908,7 @@ public final class RenderNode {
* @param rotationX The rotation value of the display list, in degrees
* @see View#setRotationX(float)
* @see #getRotationX()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setRotationX(float rotationX) {
return nSetRotationX(mNativeRenderNode, rotationX);
@@ -862,6 +929,7 @@ public final class RenderNode {
* @param rotationY The rotation value of the display list, in degrees
* @see View#setRotationY(float)
* @see #getRotationY()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setRotationY(float rotationY) {
return nSetRotationY(mNativeRenderNode, rotationY);
@@ -882,6 +950,7 @@ public final class RenderNode {
* @param scaleX The scale value of the display list
* @see View#setScaleX(float)
* @see #getScaleX()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setScaleX(float scaleX) {
return nSetScaleX(mNativeRenderNode, scaleX);
@@ -902,6 +971,7 @@ public final class RenderNode {
* @param scaleY The scale value of the display list
* @see View#setScaleY(float)
* @see #getScaleY()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setScaleY(float scaleY) {
return nSetScaleY(mNativeRenderNode, scaleY);
@@ -922,6 +992,7 @@ public final class RenderNode {
* @param pivotX The pivot value of the display list on the X axis, in pixels
* @see View#setPivotX(float)
* @see #getPivotX()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setPivotX(float pivotX) {
return nSetPivotX(mNativeRenderNode, pivotX);
@@ -942,6 +1013,7 @@ public final class RenderNode {
* @param pivotY The pivot value of the display list on the Y axis, in pixels
* @see View#setPivotY(float)
* @see #getPivotY()
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setPivotY(float pivotY) {
return nSetPivotY(mNativeRenderNode, pivotY);
@@ -969,6 +1041,8 @@ public final class RenderNode {
* Clears any pivot previously set by a call to {@link #setPivotX(float)} or
* {@link #setPivotY(float)}. After calling this {@link #isPivotExplicitlySet()} will be false
* and the pivot used for rotation will return to default of being centered on the view.
+ *
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean resetPivot() {
return nResetPivot(mNativeRenderNode);
@@ -997,8 +1071,10 @@ public final class RenderNode {
* @param distance The distance in pixels, must always be positive
* @see #setRotationX(float)
* @see #setRotationY(float)
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
- public boolean setCameraDistance(float distance) {
+ public boolean setCameraDistance(
+ @FloatRange(from = 0.0f, to = Float.MAX_VALUE) float distance) {
if (!Float.isFinite(distance) || distance < 0.0f) {
throw new IllegalArgumentException("distance must be finite & positive, given="
+ distance);
@@ -1013,7 +1089,7 @@ public final class RenderNode {
* @return the distance along the Z axis in pixels.
* @see #setCameraDistance(float)
*/
- public float getCameraDistance() {
+ public @FloatRange(from = 0.0f, to = Float.MAX_VALUE) float getCameraDistance() {
return -nGetCameraDistance(mNativeRenderNode);
}
@@ -1022,6 +1098,7 @@ public final class RenderNode {
*
* @param left The left position, in pixels, of the RenderNode
* @return true if the value changed, false otherwise
+ * @hide
*/
public boolean setLeft(int left) {
return nSetLeft(mNativeRenderNode, left);
@@ -1032,6 +1109,7 @@ public final class RenderNode {
*
* @param top The top position, in pixels, of the RenderNode
* @return true if the value changed, false otherwise.
+ * @hide
*/
public boolean setTop(int top) {
return nSetTop(mNativeRenderNode, top);
@@ -1042,6 +1120,7 @@ public final class RenderNode {
*
* @param right The right position, in pixels, of the RenderNode
* @return true if the value changed, false otherwise.
+ * @hide
*/
public boolean setRight(int right) {
return nSetRight(mNativeRenderNode, right);
@@ -1052,6 +1131,7 @@ public final class RenderNode {
*
* @param bottom The bottom position, in pixels, of the RenderNode
* @return true if the value changed, false otherwise.
+ * @hide
*/
public boolean setBottom(int bottom) {
return nSetBottom(mNativeRenderNode, bottom);
@@ -1060,8 +1140,6 @@ public final class RenderNode {
/**
* Gets the left position for the RenderNode.
*
- * See {@link #setLeft(int)}
- *
* @return the left position in pixels
*/
public int getLeft() {
@@ -1071,8 +1149,6 @@ public final class RenderNode {
/**
* Gets the top position for the RenderNode.
*
- * See {@link #setTop(int)}
- *
* @return the top position in pixels
*/
public int getTop() {
@@ -1082,8 +1158,6 @@ public final class RenderNode {
/**
* Gets the right position for the RenderNode.
*
- * See {@link #setRight(int)}
- *
* @return the right position in pixels
*/
public int getRight() {
@@ -1093,8 +1167,6 @@ public final class RenderNode {
/**
* Gets the bottom position for the RenderNode.
*
- * See {@link #setBottom(int)}
- *
* @return the bottom position in pixels
*/
public int getBottom() {
@@ -1127,20 +1199,41 @@ public final class RenderNode {
* @param right The right position of the RenderNode, in pixels
* @param bottom The bottom position of the RenderNode, in pixels
* @return true if any values changed, false otherwise.
- * @see #setLeft(int)
- * @see #setTop(int)
- * @see #setRight(int)
- * @see #setBottom(int)
+ * @hide
*/
public boolean setLeftTopRightBottom(int left, int top, int right, int bottom) {
return nSetLeftTopRightBottom(mNativeRenderNode, left, top, right, bottom);
}
/**
+ * Sets the position of the RenderNode.
+ *
+ * @param left The left position of the RenderNode, in pixels
+ * @param top The top position of the RenderNode, in pixels
+ * @param right The right position of the RenderNode, in pixels
+ * @param bottom The bottom position of the RenderNode, in pixels
+ * @return True if the value changed, false if the new value was the same as the previous value.
+ */
+ public boolean setPosition(int left, int top, int right, int bottom) {
+ return nSetLeftTopRightBottom(mNativeRenderNode, left, top, right, bottom);
+ }
+
+ /**
+ * Sets the position of the RenderNode.
+ *
+ * @param position The position rectangle in pixels
+ * @return True if the value changed, false if the new value was the same as the previous value.
+ */
+ public boolean setPosition(Rect position) {
+ return nSetLeftTopRightBottom(mNativeRenderNode,
+ position.left, position.top, position.right, position.bottom);
+ }
+
+ /**
* Offsets the left and right positions for the RenderNode
*
* @param offset The amount that the left and right positions are offset in pixels
- * @return true if any values changed, false otherwise.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean offsetLeftAndRight(int offset) {
return nOffsetLeftAndRight(mNativeRenderNode, offset);
@@ -1150,7 +1243,7 @@ public final class RenderNode {
* Offsets the top and bottom values for the RenderNode
*
* @param offset The amount that the left and right positions are offset in pixels
- * @return true if any values changed, false otherwise.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean offsetTopAndBottom(int offset) {
return nOffsetTopAndBottom(mNativeRenderNode, offset);
@@ -1170,8 +1263,10 @@ public final class RenderNode {
* Gets the approximate memory usage of the RenderNode for debug purposes. Does not include
* the memory usage of any child RenderNodes nor any bitmaps, only the memory usage of
* this RenderNode and any data it owns.
+ *
+ * @return Approximate memory usage in bytes.
*/
- public int computeApproximateMemoryUsage() {
+ public @BytesLong long computeApproximateMemoryUsage() {
return nGetDebugSize(mNativeRenderNode);
}
@@ -1186,7 +1281,7 @@ public final class RenderNode {
* it prevent any 'false' in any of its children.
*
* @param allow Whether or not to allow force dark.
- * @return true If the value has changed, false otherwise.
+ * @return True if the value changed, false if the new value was the same as the previous value.
*/
public boolean setForceDarkAllowed(boolean allow) {
return nSetAllowForceDark(mNativeRenderNode, allow);
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java b/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java
index 60bd60f0bfd1..fece8babb400 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/CustomRenderer.java
@@ -49,7 +49,7 @@ public class CustomRenderer extends Activity {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mContent.setLeftTopRightBottom(0, 0, width, height);
- RecordingCanvas canvas = mContent.startRecording();
+ RecordingCanvas canvas = mContent.beginRecording();
canvas.drawColor(Color.WHITE);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLACK);
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MyLittleTextureView.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MyLittleTextureView.java
index 8bd7d797aea3..08d5d4fff50a 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/MyLittleTextureView.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MyLittleTextureView.java
@@ -60,14 +60,14 @@ public class MyLittleTextureView extends Activity {
outline.setAlpha(1f);
childNode.setOutline(outline);
{
- Canvas canvas = childNode.startRecording();
+ Canvas canvas = childNode.beginRecording();
canvas.drawColor(Color.BLUE);
}
childNode.endRecording();
childNode.setElevation(20f);
{
- Canvas canvas = mContent.startRecording();
+ Canvas canvas = mContent.beginRecording();
canvas.drawColor(Color.WHITE);
canvas.enableZ();
canvas.drawRenderNode(childNode);