diff --git a/core/api/current.txt b/core/api/current.txt index 1902c816ae364..c3a8f602170b5 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -15731,7 +15731,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); @@ -48451,6 +48451,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 de320b81f7e98..1d1c87d069394 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; @@ -21064,6 +21065,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 },