From 8b5c9c606138761c84cbe7cad34fdcf08b6c5f9b Mon Sep 17 00:00:00 2001 From: Nader Jawad Date: Fri, 11 Dec 2020 17:55:17 -0800 Subject: [PATCH] Added View#setRenderEffect API Added View API to configure RenderEffect on the underlying RenderNode Bug: 159712515 Test: Added CtsUiRenderingTestCase Change-Id: Ic64009ac79927d61c7c1f63306ced3da18fce1da --- core/api/current.txt | 3 ++- core/java/android/view/View.java | 16 ++++++++++++++++ graphics/java/android/graphics/RenderNode.java | 7 ++++--- libs/hwui/jni/android_graphics_RenderNode.cpp | 2 +- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index a72261bd570a9..1e33b9b8066cb 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -15719,7 +15719,7 @@ package android.graphics { method public boolean setPosition(@NonNull android.graphics.Rect); method public boolean setProjectBackwards(boolean); method public boolean setProjectionReceiver(boolean); - method public void setRenderEffect(@Nullable android.graphics.RenderEffect); + method public boolean setRenderEffect(@Nullable android.graphics.RenderEffect); method public boolean setRotationX(float); method public boolean setRotationY(float); method public boolean setRotationZ(float); @@ -53216,6 +53216,7 @@ package android.view { method public void setPivotY(float); method public void setPointerIcon(android.view.PointerIcon); method public void setPressed(boolean); + method public void setRenderEffect(@Nullable android.graphics.RenderEffect); method public final void setRevealOnFocusHint(boolean); method public final void setRight(int); method public void setRotation(float); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 9943e02032983..72d283034b288 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -73,6 +73,7 @@ import android.graphics.RecordingCanvas; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; +import android.graphics.RenderEffect; import android.graphics.RenderNode; import android.graphics.Shader; import android.graphics.drawable.ColorDrawable; @@ -21063,6 +21064,21 @@ public class View implements Drawable.Callback, KeyEvent.Callback, invalidate(true); } + /** + * Configure the {@link android.graphics.RenderEffect} to apply to this View. + * This will apply a visual effect to the results of the View before it is drawn. For example if + * {@link RenderEffect#createBlurEffect(float, float, RenderEffect, Shader.TileMode)} + * is provided, the contents will be drawn in a separate layer, then this layer will be blurred + * when this View is drawn. + * @param renderEffect to be applied to the View. Passing null clears the previously configured + * {@link RenderEffect} + */ + public void setRenderEffect(@Nullable RenderEffect renderEffect) { + if (mRenderNode.setRenderEffect(renderEffect)) { + invalidateViewProperty(true, true); + } + } + /** * Updates the {@link Paint} object used with the current layer (used only if the current * layer type is not set to {@link #LAYER_TYPE_NONE}). Changed properties of the Paint diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java index 001ebacfd2cd6..117828dd23db9 100644 --- a/graphics/java/android/graphics/RenderNode.java +++ b/graphics/java/android/graphics/RenderNode.java @@ -858,9 +858,10 @@ public final class RenderNode { * be blurred when this RenderNode is drawn into the destination. * @param renderEffect to be applied to the RenderNode. Passing null clears all previously * configured RenderEffects + * @return True if the value changed, false if the new value was the same as the previous value. */ - public void setRenderEffect(@Nullable RenderEffect renderEffect) { - nSetRenderEffect(mNativeRenderNode, + public boolean setRenderEffect(@Nullable RenderEffect renderEffect) { + return nSetRenderEffect(mNativeRenderNode, renderEffect != null ? renderEffect.getNativeInstance() : 0); } @@ -1670,7 +1671,7 @@ public final class RenderNode { private static native boolean nSetAlpha(long renderNode, float alpha); @CriticalNative - private static native void nSetRenderEffect(long renderNode, long renderEffect); + private static native boolean nSetRenderEffect(long renderNode, long renderEffect); @CriticalNative private static native boolean nSetHasOverlappingRendering(long renderNode, diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp index 4b4aa92b97b72..6f4ba894e3af5 100644 --- a/libs/hwui/jni/android_graphics_RenderNode.cpp +++ b/libs/hwui/jni/android_graphics_RenderNode.cpp @@ -696,7 +696,7 @@ static const JNINativeMethod gMethods[] = { { "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip }, { "nSetAlpha", "(JF)Z", (void*) android_view_RenderNode_setAlpha }, - { "nSetRenderEffect", "(JJ)V", (void*) android_view_RenderNode_setRenderEffect }, + { "nSetRenderEffect", "(JJ)Z", (void*) android_view_RenderNode_setRenderEffect }, { "nSetHasOverlappingRendering", "(JZ)Z", (void*) android_view_RenderNode_setHasOverlappingRendering }, { "nSetUsageHint", "(JI)V", (void*) android_view_RenderNode_setUsageHint },