Mostrar imágenesVistas con tema de animación

Quiero mostrar ImageViews en GridView usando animación. Puedo mostrarlos y aplicar la animación correctamente.

Pero el problema es que si aplico la animación en ImageView1 y luego en ImageView2 (antes de terminar la animación en ImageView1), la animación en ImageView1 se interrumpe y ImageView1 se establece directamente en estado final.

Tenga en cuenta que descargar imagen usando ThreadPoolExecutor con 2 subprocesos. Cada vez que se hace una descarga de una imagen, llamo addImage(image) método de debajo de ImageAdapter que a su vez añade imagen en GridView y GridView se actualiza para mostrar el último conjunto de imágenes. Y aquí, durante la representación, la nueva imagen se muestra con animación y esta animación (supongo) interrumpe la animación de las imágenes que actualmente se animan.

ImageAdapter:

 public class ImageAdapter extends BaseAdapter { private Context mContext; private List<Bitmap> images; private ArrayList<Integer> colors; private boolean[] alreadyLoadedIndexes; Animation animation; AnimatorSet animator; public void addImage(Bitmap img) { images.add(img); notifyDataSetChanged(); } public void setAnimation(Animation animation) { this.animator = null; this.animation = animation; } public void setAnimator(AnimatorSet animation) { this.animation = null; this.animator = animation; } public void resetImages() { images.clear(); notifyDataSetChanged(); alreadyLoadedIndexes = null; alreadyLoadedIndexes = new boolean[20]; } // Constructor public ImageAdapter(Context c) { mContext = c; images = new ArrayList<Bitmap>(); colors = new ArrayList<Integer>(); colors.add(Color.CYAN); colors.add(Color.BLUE); colors.add(Color.GRAY); colors.add(Color.YELLOW); colors.add(Color.MAGENTA); alreadyLoadedIndexes = new boolean[20]; } @Override public int getCount() { return 20; } @Override public Object getItem(int position) { return 20; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView = new ImageView(mContext); imageView .setBackgroundColor(colors.get((int) ((Math.sqrt(position) + 2 * position) % 5))); // If image at index 'position' is available if (images.size() > position) { // If loading this image first time then only apply animation if (!alreadyLoadedIndexes[position]) { // If animation is specified if (this.animation != null) { imageView.setImageBitmap(images.get(position)); imageView.startAnimation(animation); } // If animator set is specified else if (this.animator != null) { imageView.setImageBitmap(null); imageView.setBackgroundColor(colors.get((int) ((Math .sqrt(position) + 2 * position) % 5))); animator.setTarget(imageView); animator.start(); Log.e("", "setting image after " + animator.getDuration() / 2); new Handler().postDelayed( new runnable(imageView, images.get(position)), 500); } else { // Use default animation if nothing is specified. imageView.setImageBitmap(images.get(position)); animation = AnimationUtils.loadAnimation(mContext, R.anim.fade_in); imageView.startAnimation(animation); } } else { imageView.setImageBitmap(images.get(position)); } alreadyLoadedIndexes[position] = true; } imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(new GridView.LayoutParams(150, 150)); return imageView; } class runnable implements Runnable { ImageView image; Bitmap bitmap; public runnable(ImageView img, Bitmap bitmap) { this.image = img; this.bitmap = bitmap; } @Override public void run() { Log.e("", "setting image."); image.setImageBitmap(bitmap); } } } 

Pruebe el controlor de animación de diseño para GridView, animará las vistas elemento por elemento con respecto a la duración del tiempo. Revise este enlace ,

¿Ha intentado aplicar la animación fuera del adaptador getView método como:

 mGridView.getChildAt(childIndexNeededToAnimate).startAnimation(animation); 

Estas vistas de los niños son independientes y no se reciclan ya que ya están dibujados.

Tienes alguna alternativa.

Primero puede utilizar Animation in your adapter clase de Animation in your adapter si no desea cambiar su código. Para que compruebe esto .

En su clase del adaptador dentro del getView usted tiene que llamar la animación como esto,

  Animation animation = null; animation = AnimationUtils.loadAnimation(context, R.anim.push_left_in); animation.setDuration(500); convertView.startAnimation(animation); return convertView; 

En segundo lugar debe utilizar GridLayoutAnimationController en el que se utiliza un controlador de animación de diseño para animar a los niños de un diseño de cuadrícula.

  • Muestra 1
  • Muestra 2

Solo una suposición. No estoy seguro de si ayudará, ni si leo bien su código. Supongo que el problema es más difícil de lo que supongo. Sin embargo, está utilizando el mismo objeto de animación para cada elemento. Tal vez debería crear una nueva animación para cada elemento. Esta podría ser la razón por la que su animación se detiene cuando se inicia una nueva porque la nueva llamada sólo se reutiliza y se reinicia.

Buena suerte.

El problema es notifyDataSetChanged(); Interrumpe la animación. Trate de llamar cuando termine la animación.

  • Java marco de desarrollo de escritorio similar a Android?
  • ¿Utilizar una clase para almacenar datos estáticos en Java?
  • Deslizar la carga en SimpleTarget <Bitmap> no respetando el ancho y la altura especificados
  • Recortar una imagen en forma irregular
  • Recursos de Android: ¿Cómo se cargan los mapas de bits de los recursos manejados en cuanto a memoria?
  • El color de fondo del botón de Android cambia el tamaño del botón
  • Cadena de byte con UTF-8 da diferentes resultados en Android que en Windows JVM
  • Android: DigitalClock eliminar segundos
  • ¿Podemos conectar la base de datos MySQL remota en Android usando JDBC?
  • Compartir clases java entre el servicio web y el cliente
  • Android get Tiempo UTC actual
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.