I've been trying to run an Animated Vector Drawable on a device with API level 15.
The following is my animated vector "animated_feedback.xml":
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/feedback"> <target android:animation="@animator/background_circle_animator" android:name="BG_White_Circle"/> </animated-vector>
The drawable "feedback.xml" contains the following:
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="180dp" android:height="180dp" android:viewportWidth="180" android:viewportHeight="180"> <group android:name="BG_White_Circle_Group"> <path android:name="BG_White_Circle" android:fillColor="#fff" android:pathData="M 90 0 C 139.705627485 0 180 40.2943725152 180 90 C 180 139.705627485 139.705627485 180 90 180 C 40.2943725152 180 0 139.705627485 0 90 C 0 40.2943725152 40.2943725152 0 90 0 Z" /> <path android:name="Ring" android:strokeColor="#0094c1" android:strokeWidth="5.00000003634922" android:strokeMiterLimit="10" android:pathData="M 90 9 C 134.735064736 9 171 45.2649352637 171 90 C 171 134.735064736 134.735064736 171 90 171 C 45.2649352637 171 9 134.735064736 9 90 C 9 45.2649352637 45.2649352637 9 90 9 Z" /> </group> </vector>
And one of the animators "background_circle_animator.xml" is the following:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially" android:fillAfter="true"> <objectAnimator android:propertyName="fillAlpha" android:valueType="floatType" android:valueFrom="0f" android:valueTo="1f" android:duration="200"/> <objectAnimator android:duration="700"/> <objectAnimator android:propertyName="fillAlpha" android:valueType="floatType" android:valueFrom="1f" android:valueTo="0f" android:duration="200"/> </set>
In my activity_main.xml I have the ImageView that should play this animation:
<ImageView android:id="@+id/feedback_ui" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible"/>
Finally in my MainActivity.java I have the following code:
ImageView feedbackUI = (ImageView) findViewById(R.id.feedback_ui); feedbackUI.setImageResource(R.drawable.animated_feedback); Drawable animation = feedbackUI.getDrawable(); if (animation instanceof Animatable) { feedbackUI.setVisibility(View.VISIBLE); ((Animatable) animation).start(); }
The following is my gradle:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "karim.com.testinganimation" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" vectorDrawables.useSupportLibrary = true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.4.0' }
When running this code you should see a white circle with a blue ring on top of it and it should fade in and then fade out.
I ran this code on API > 21 device and it ran perfectly.
When I run it on a device with API 15 I get the following crash as soon as I the animation starts:
D/PropertyValuesHolder(19300): Can't find native method using JNI, use reflectionjava.lang.NoSuchMethodError: no method with name='set' signature='(F)V' in class Landroid/support/graphics/drawable/VectorDrawableCompat$VFullPath; E/PropertyValuesHolder(19300): Couldn't find setter/getter for property null with value type float E/PropertyValuesHolder(19300): Couldn't find no-arg method for property null: java.lang.NoSuchMethodException: get [] D/AndroidRuntime(19300): Shutting down VM W/dalvikvm(19300): threadid=1: thread exiting with uncaught exception (group=0x40a9e1f8) E/AndroidRuntime(19300): FATAL EXCEPTION: main E/AndroidRuntime(19300): java.lang.NullPointerException E/AndroidRuntime(19300): at android.animation.PropertyValuesHolder.setupSetterAndGetter(PropertyValuesHolder.java:513) E/AndroidRuntime(19300): at android.animation.ObjectAnimator.initAnimation(ObjectAnimator.java:392) E/AndroidRuntime(19300): at android.animation.ValueAnimator.setCurrentPlayTime(ValueAnimator.java:544) E/AndroidRuntime(19300): at android.animation.ValueAnimator.start(ValueAnimator.java:934) E/AndroidRuntime(19300): at android.animation.ValueAnimator.start(ValueAnimator.java:957) E/AndroidRuntime(19300): at android.animation.ObjectAnimator.start(ObjectAnimator.java:370) E/AndroidRuntime(19300): at android.animation.AnimatorSet$DependencyListener.startIfReady(AnimatorSet.java:705) E/AndroidRuntime(19300): at android.animation.AnimatorSet$DependencyListener.onAnimationEnd(AnimatorSet.java:659) E/AndroidRuntime(19300): at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1040) E/AndroidRuntime(19300): at android.animation.ValueAnimator.access$900(ValueAnimator.java:49) E/AndroidRuntime(19300): at android.animation.ValueAnimator$AnimationHandler.handleMessage(ValueAnimator.java:675) E/AndroidRuntime(19300): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(19300): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(19300): at android.app.ActivityThread.main(ActivityThread.java:4424) E/AndroidRuntime(19300): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(19300): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(19300): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) E/AndroidRuntime(19300): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) E/AndroidRuntime(19300): at dalvik.system.NativeStart.main(Native Method) W/ActivityManager( 164): Force finishing activity karim.com.testinganimation/.MainActivity
How can I fix this issue as it is very critical to run on devices with API level 15.