vector-compat icon indicating copy to clipboard operation
vector-compat copied to clipboard

MorphButton with animate-vector as drawable not inflating in kitkat or below.

Open anjanibansal opened this issue 10 years ago • 4 comments

I'm trying to use the MorphButton to transition from one drawable to another. Both vc_startDrawable & vc_endDrawable use an animated-vector. The objectAnimator animates the trimPathStart property of a path vector. Everything's working fine on Android Lollipop but on kitkat or below, the app's crashing as soon as the activity with the MorphButton starts up. Since I'm using MorphButton, I'm not doing any inflation in java. I'm using buildToolsVersion '23.0.2' & minSdkVersion 14. Below is the necessary code:

<com.wnafee.vector.MorphButton
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@null"
        app:vc_endDrawable="@drawable/anim_end"
        app:vc_startDrawable="@drawable/anim_start" />  

drawables anim_end and anim_start are similar to each other:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
      android:drawable="@drawable/sample">

   <target
       android:name="b"
       android:animation="@anim/anim_empty" />

  <target
      android:name="s"
      android:animation="@anim/anim_fill" />
</animated-vector>  

animators anim_fill and anim_empty are similar to each other:

<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:propertyName="trimPathStart"
    android:valueFrom="1"
    android:valueTo="0"
    android:duration="@integer/anim_duration"
    android:interpolator="@android:interpolator/linear_out_slow_in"
    android:valueType="floatType"
    app:vc_valueType="floatType"/>  

vector drawable sample is as follows:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:width="250dp"
    android:height="24dp"
    android:viewportWidth="250"
    android:viewportHeight="24"
    app:vc_viewportWidth="250"
    app:vc_viewportHeight="24">

    <path
        android:name="s"
        android:pathData="@string/s_path"
        android:strokeWidth="1"
        android:strokeColor="@color/c1"
        android:strokeAlpha="0.8"
        android:strokeLineCap="round"

        app:vc_pathData="@string/s_path"
        app:vc_strokeWidth="1"
        app:vc_strokeColor="@color/c1"
        app:vc_strokeAlpha="0.8"
        app:vc_strokeLineCap="round" />

    <path
        android:name="b"
        android:pathData="@string/b_path"
        android:strokeWidth="1"
        android:strokeColor="@color/c1"
        android:strokeAlpha="0.8"
        android:strokeLineCap="square"

        app:vc_pathData="@string/b_path"
        app:vc_strokeWidth="1"
        app:vc_strokeColor="@color/c1"
        app:vc_strokeAlpha="0.8"
        app:vc_strokeLineCap="square" />

</vector>  

And finally here's the log report when the crash occurs:

-12 15:53:02.118  27342-27342/com.example E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example, PID: 27342
    android.view.InflateException: Binary XML file line #56: Error inflating class com.wnafee.vector.MorphButton
            at android.view.LayoutInflater.createView(LayoutInflater.java:627)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:703)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:499)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at com.example.MyFragment.onCreateView(MyFragment.java:65)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5433)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:601)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:703)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:499)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at com.example.MyFragment.onCreateView(MyFragment.java:65)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5433)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.content.res.Resources$NotFoundException: File res/drawable/anim_start.xml from drawable resource ID #0x7f02003c
            at android.content.res.Resources.loadDrawable(Resources.java:3451)
            at android.content.res.Resources.getDrawable(Resources.java:1894)
            at com.wnafee.vector.compat.ResourcesCompat.getDrawable(ResourcesCompat.java:34)
            at com.wnafee.vector.MorphButton.setStartDrawable(MorphButton.java:282)
            at com.wnafee.vector.MorphButton.<init>(MorphButton.java:141)
            at com.wnafee.vector.MorphButton.<init>(MorphButton.java:113)
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:601)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:703)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:499)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at com.example.MyFragment.onCreateView(MyFragment.java:65)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5433)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag animated-vector
            at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:969)
            at android.graphics.drawable.Drawable.createFromXml(Drawable.java:913)
            at android.content.res.Resources.loadDrawable(Resources.java:3447)
            at android.content.res.Resources.getDrawable(Resources.java:1894)
            at com.wnafee.vector.compat.ResourcesCompat.getDrawable(ResourcesCompat.java:34)
            at com.wnafee.vector.MorphButton.setStartDrawable(MorphButton.java:282)
            at com.wnafee.vector.MorphButton.<init>(MorphButton.java:141)
            at com.wnafee.vector.MorphButton.<init>(MorphButton.java:113)
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:601)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:703)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:499)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at com.example.MyFragment.onCreateView(MyFragment.java:65)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5433)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)  

Line 65 of MyFragment is:

View rootView = inflater.inflate(R.layout.fragment_layout, container, false);

I believe the problem is somewhere in the ResourcesCompat. It's somehow not using the library's own AnimatedVectorDrawable for inflation.

If any other info is needed, please let me know. Please guide me where I'm going wrong or suggest a workaround. I'm stuck here and very close to my deadline. Thanks.

anjanibansal avatar Jan 14 '16 12:01 anjanibansal

I encountered this problem In parsing the animation will determine your path animation that is then the source code is

if (valueType == VALUE_TYPE_PATH) { evaluator = setupAnimatorForPath(anim, arrayAnimator); } else { throw new IllegalArgumentException("target is not a pathType target"); }

I try change floatType to pathType , This can be demonstrated。but animator will crash

zhe8300975 avatar Jan 15 '16 07:01 zhe8300975

Did you find any work around for this?

anjanibansal avatar Jan 16 '16 14:01 anjanibansal

Unfortunately, I have not found

zhe8300975 avatar Jan 18 '16 06:01 zhe8300975

I'm having exactly the same problem. However, it seems to work fine with the resources(drawables) from the library. So the following code works fine, <com.wnafee.vector.MorphButton android:id="@+id/playPauseBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" app:vc_startDrawable="@drawable/ic_pause_to_play" app:vc_endDrawable="@drawable/ic_play_to_pause" />

ndhunju avatar Jan 27 '16 22:01 ndhunju