Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cuál es la forma óptima de animar un dibujable dentro de una vista utilizando las clases de animación?

He leído sobre la animación de la característica y la aceleración del hardware pero soy todavía incierto qué es la manera más eficiente de utilizar las clases del animador. (Para el bien de esta pregunta no necesito soportar dispositivos antes de Honeycomb, así que quiero usar las clases de animación.)

Por ejemplo, digamos que tengo una vista. En esta vista tengo un BitmapDrawable que quiero desvanecer adentro. Hay también muchos otros elementos dentro de la visión que no cambiarán.

  • Hardware acelerado FFmpeg en android?
  • Aceleración de hardware de Android: para usar o no utilizar?
  • ¿Qué propiedad o objeto sería mejor utilizar con el animador? ¿El dibujable? Una pintura que estoy dibujando el mapa de bits con en onDraw? ¿Algo más?

    ¿Cómo se puede hacer esto para ser más eficiente con la aceleración de hardware? ¿Esto requerirá invocación invalidate para cada paso de la animación o hay una manera de animar sólo el dibujable y no causar el resto de la vista para ser redibujado completamente para cada paso de la animación?

    Supongo que me imagino un caso óptimo sería el resto de la vista no tener que ser completamente rediseñado en el software, sino más bien la aceleración de hardware eficientemente se desvaneciendo el dibujable.

    ¿Sugerencias o sugerencias para acercamientos recomendados?

    ¡Gracias!

  • ¿Cómo determinar de forma fiable el ancho de una cadena de varias líneas?
  • Android ImageView tamaño no escala con la imagen de origen
  • SetRadius en Circle da mala experiencia de usuario en Google Maps
  • Android AsyncTask - evitar múltiples instancias en ejecución
  • Problemas de Spreadtrum (Vendor ID 1782) Conexión a adb
  • Posible obtener detalles de error específicos de Android SQLiteConstraintException?
  • 3 Solutions collect form web for “¿Cuál es la forma óptima de animar un dibujable dentro de una vista utilizando las clases de animación?”

    Con el uso de los animadores de propiedades de objetos, básicamente son sólo funciones matemáticas que repetidamente llaman un método "setN ()" cada miliseconds X donde "N" es la propiedad que desea cambiar.

    En el ejemplo proporcionado en el caso de alfa, ambos requerirían una llamada a invalidate() para volver a dibujar la Vista que está animando. La diferencia es cuando llamas a setAlpha() en el objeto View , llama invalidate() por ti. Si estableciera el objeto de destino en el objeto Paint que se utiliza para dibujar el dibujable, todavía tendría que llamar a invalidate() en la View para que se vuelva a dibujar con los nuevos parámetros de Paint .

    Idealmente, desea establecer el objetivo en el nivel más alto que pueda para que el redibujo sólo suceda en las vistas que desea animar. Si establece el destino en la Vista raíz, por ejemplo, invocará invalidate() en cada niño de todo el grupo de vistas, que a su vez llamará draw() a cada niño del grupo ViewGroup. Si lo configura en un ImageView nivel superior, sólo se volverá a dibujar ImageView .

    Para utilizar mejor el hardware, debe utilizar las propiedades de capa. Primero, debes decidir qué es la vista padre más alta que quieras animar. Si sólo desea atenuar el Drawable , entonces será la vista Drawable o que contiene. Si desea atenuarse todo, entonces será la vista raíz. Lo que decidas animar se aplicará a la View como un todo a la vez.

    Use setLayerType() en la vista principal justo antes de iniciar el Animator. Establecerlo para View#LAYER_TYPE_HARDWARE . A continuación, establezca un AnimationListener y restablezca el LayerType a View#LAYER_TYPE_SOFTWARE o View#LAYER_TYPE_NONE al finalizar el animador.

     myParentView.setLayerType(View.LAYER_TYPE_HARDWARE, null); myObjectAnimator.addListener(new ViewAnimator.AnimatorListener() { public void onAnimationEnd(Animator animation) { myParentView.setLayerType(View.LAYER_TYPE_NONE); } public void onAnimationRepeat(Animator animation) { } public void onAnimationStart(Animator animation) { } public void onAnimationCancel(Animator animation) { myParentView.setLayerType(View.LAYER_TYPE_NONE, null); } } myObjectAnimator.start(); 

    En este caso, si tuvieras que traducir myParentView usando la propiedad translateX , entonces pondrá la capa myParentView y todos sus hijos en un solo plano. Póngalo en la memoria del hardware. Traducir la vista completa a la vez. A continuación, al finalizar, elimine myParentView de la memoria.

    EDITAR:

    Una nota final, Alpha causa estragos en la CPU. Si usted tiene algo en medio-alfa y lo traduce a través de la vista, será más difícil de hacer que si usted simplemente traduce la vista. Úselo con moderación.

    Tal vez, puede superponer una vista nueva (que sólo contiene el animador) en la original. La nueva vista establecida en Transparente.

    El restablecimiento que debe hacer es inválido la vista nueva sin su vista original.

    Después de pasar por sus consultas le sugeriré por favor pasar por este documento estándar que es ordenado para hacerle entender cómo utilizar invalidate() correctamente. En segundo lugar, hay varias formas ya proporcionadas por la API de Android para trabajar con animación en diferentes situaciones.

    Aquí , espero que la mayoría de sus dudas se aclaren. Por favor, vaya a través de las subsecciones y blog relacionado mencionado su.

    Espero que esto te ayudará.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.