AnimatedVectorDrawable en la biblioteca de soporte y animación de "pathData"
Estoy utilizando vectores animados de Support Support Library 23.2.0 , así:
compile 'com.android.support:support-vector-drawable:23.2.0' compile 'com.android.support:animated-vector-drawable:23.2.0'
Estoy tratando de animar " pathData " (líneas de morphing uno a otro). Mi código se ve así.
- ¿Cuál es el orden correcto de llamar métodos de superclase en los métodos onPause, onStop y onDestroy? ¿y por qué?
- Custom SimpleAdapter sólo muestra texto de ejemplo Android
- Cómo ejecutar una aplicación en primer plano en las versiones de Android inferiores a 5.1
- ¿Cómo debo dar imágenes esquinas redondeadas en Android?
- Cliente Android para servicio web REST con seguridad básica
Drawable / ic_done.xml:
<?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.0"> <path android:name="tick" android:pathData="M4.8,12L9,16.2L20,8" android:strokeColor="#FF000000" /> </vector>
Dibujable / ic_done_animated.xml:
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:drawable="@drawable/ic_done"> <target android:name="tick" android:animation="@animator/tick_path_animation" /> </animated-vector>
Animator / tick_path_animation.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <objectAnimator android:duration="200" android:propertyName="pathData" android:valueFrom="M4.8,12L4.8,12L4.8,12" android:valueTo="M4.8,12L9,16.2L9,16.2" android:valueType="pathType" /> <objectAnimator android:duration="200" android:propertyName="pathData" android:valueFrom="M4.8,12L9,16.2L9,16.2" android:valueTo="M4.8,12L9,16.2L20,8" android:valueType="pathType" /> </set>
Código Java:
ImageView vImgAnimated = findByViewId(R.id.img); AnimatedVectorDrawableCompat animatedVector = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_done_animated); vImgAnimated.setImageDrawable(animatedVector); animatedVector.start();
Funciona bien en el nuevo dispositivo con API de nivel 21, pero tengo un problema en el dispositivo con API de nivel 16 :
java.lang.NumberFormatException: Invalid int: "M4.8,12L4.8,12L4.8,12" at java.lang.Integer.invalidInt(Integer.java:138) at java.lang.Integer.parse(Integer.java:375) at java.lang.Integer.parseInt(Integer.java:366) at com.android.internal.util.XmlUtils.convertValueToInt(XmlUtils.java:123) at android.content.res.TypedArray.getInt(TypedArray.java:254) at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:258) at android.animation.AnimatorInflater.loadObjectAnimator(AnimatorInflater.java:161) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:117) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93) at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.inflate(AnimatedVectorDrawableCompat.java:377) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.createFromXmlInner(AnimatedVectorDrawableCompat.java:162) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.create(AnimatedVectorDrawableCompat.java:142)
De acuerdo con un artículo android-support-library-232, los vectores animados (AnimatedVectorDrawableCompat) deberían ser respaldados de nuevo al nivel 11 de la API .
Parece que falla al leer el atributo valueFrom de tick_path_animation.xml . Este tipo de atributo "pathType" probablemente no es compatible (todavía?). Alguna idea de como resolver esto?
- Android Studio preDexDebug después de agregar jar archivo
- ¿Cuáles son las consecuencias si intentamos conectar un hilo nativo permanentemente a la DVM (JVM)?
- Llamar a MediaRecorder bloquea la aplicación en AndroidStudio
- JSONObject no serializable?
- java.lang.NullPointerException: Intenta invocar el método de interfaz 'OnColorChangeListener.colorChanged (java.lang.String)' en una referencia de objeto nulo
- ContentResolver.notifyChange no funciona
- Problema con revelación circular y CircularRevealLibrary en Android
- EditText setText no se muestra en un fragmento de diálogo
Lo sentimos, esto no funcionará con la versión actual de la biblioteca de soporte (23.2.0).
Ver el artículo de Chris Banes .
También hay algunas limitaciones a qué tipo de cosas pueden hacer los vectores animados cuando se ejecutan en plataformas <API 21. Las siguientes son las cosas que no funcionan actualmente en esas plataformas:
Path Morphing (evaluador de PathType). Esto se utiliza para transformar una ruta en otra ruta.
Interpolación de ruta. Esto se utiliza para definir un interpolador flexible (representado como una ruta) en lugar de los definidos por el sistema como LinearInterpolator.
Mover a lo largo del camino. Esto se utiliza raramente. El objeto de geometría puede moverse alrededor, a lo largo de una trayectoria arbitraria.
Por lo tanto, la animación de pathData, o 'Path Morphing' no está soportado actualmente.
Actualizar:
Comentario de Frank:
Esto se fija finalmente en soporte lib 25.4.0 (Junio 2017): "El morphing de ruta y la interpolación de ruta son compatibles en AnimatedVectorDrawableCompat"
El "flash" circular en la animación anterior (en el centro de la imagen) es yo presionando la pantalla para iniciar el morph.
Inflando dibujables
`VectorDrawable`
`AnimatedVectorDrawable`
en esta biblioteca de soporte (`vector-compat`) pueden inflarse de esta manera:
- Llamar a los
getDrawable()
staticgetDrawable()
:
// Esto solo inflar un dibujable con <vector> como el elemento raíz VectorDrawable.getDrawable (contexto, R.drawable.ic_arrow_vector); // Esto solo inflar un dibujable con <animated-vector> como el elemento raíz AnimatedVectorDrawable.getDrawable (contexto, R.drawable.ic_arrow_to_menu_animated_vector); // Esto inflar cualquier drawable y auto-fallback a la implementación de lollipop en dispositivos api 21+ ResourcesCompat.getDrawable (contexto, R.drawable.any_drawable);
Si se infla el código Drawable en java, se recomienda utilizar siempre ResourcesCompat.getDrawable()
ya que esto maneja el fallback de Lollipop cuando sea aplicable. Esto permite al sistema almacenar en caché ConstantState Drawable y por lo tanto es más eficiente.
La biblioteca (`vector-compat`) tiene las siguientes animaciones de morph (bidireccional):
Como se puede ver, he producido la imagen de arriba en mi teléfono API 16
:
import com.wnafee.vector.compat.AnimatedVectorDrawable; mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);
Vea el github README para vector-compat
aquí: https://github.com/wnafee/vector-compat
Esto solucionará el problema (hasta la API 14
) si lo fusiona con las dependencies
build.gradle
del módulo de build.gradle
(generalmente al final del archivo):
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support:design:25.0.0' //not needed // compile 'com.android.support:support-vector-drawable:25.0.0' compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat // Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0 //not needed // compile 'com.android.support:support-animated-vector-drawable:25.0.0' }
- Servicio no disponible en geoCoder
- ¿Eliminar todos los elementos almacenados en caché creados por un WebView?