shamanland / floating-action-button

Implementation of a circular button made of paper that lifts and emits ink reactions on press.
http://shamanland.github.io/floating-action-button
Apache License 2.0
371 stars 88 forks source link

Fix crash when shadow is disabled #24

Closed nkming2 closed 9 years ago

nkming2 commented 9 years ago

setGradientRadius(0f) will throw IllegalArgumentException, make the shadow transparent instead

ok3141 commented 9 years ago

How to reproduce this situation?

nkming2 commented 9 years ago

It happens that disabling the shadow would have a RadialGradient constructed with 0 radius and throw.

This probably only happens on older device (I'm running on JB emulator) since Google has guarded the 0 radius case with the following code in later framework (21 confirmed, others not known)

if (radius == 0) {
    // We can't have a shader with zero radius, so let's
    // have a very, very small radius.
    radius = 0.001f;
}

We can also follow Google in setting .001 instead of making it transparent.

nkming2 commented 9 years ago

Logcat (from JB emulator)

    java.lang.IllegalArgumentException: radius must be > 0
            at android.graphics.RadialGradient.<init>(RadialGradient.java:34)
            at android.graphics.drawable.GradientDrawable.ensureValidRect(GradientDrawable.java:744)
            at android.graphics.drawable.GradientDrawable.draw(GradientDrawable.java:425)
            at android.graphics.drawable.LayerDrawable.draw(LayerDrawable.java:345)
            at android.view.View.draw(View.java:13443)
            at android.view.View.getDisplayList(View.java:12409)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2911)
            at android.view.View.getDisplayList(View.java:12345)
            at android.view.View.getDisplayList(View.java:12453)
            at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1144)
            at android.view.ViewRootImpl.draw(ViewRootImpl.java:2147)
            at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2019)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1830)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
            at android.view.Choreographer.doCallbacks(Choreographer.java:555)
            at android.view.Choreographer.doFrame(Choreographer.java:525)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
ok3141 commented 9 years ago

I saw the code with 0.001f constant, but I think your solution is more preferred. I will update artifacts on Maven soon.