MorphButton with animate-vector as drawable not inflating in kitkat or below.
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.
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
Did you find any work around for this?
Unfortunately, I have not found
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" />