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.
- Android Studio bloqueado en la pantalla de carga
- No se puede encontrar la clase de símbolo onClickListener
- Diferencia entre android.R.layout.simple_spinner_dropdown_item y android.R.layout.simple_spinner_item
- Observable / Observador no funciona?
- ListView: ¿Cómo permanecer resaltado / seleccionado después de pulsar el botón Atrás?
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); } } }
- Error en la verificación de la firma de Android LVL
- Cómo imprimir en la consola en Android Studio?
- Cómo insertar% 20 en lugar de espacio en android
- ChildFragmentManager java.lang.IllegalStateException: La actividad ha sido destruida
- Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
- Lectura de un archivo de texto mediante InputStream
- Android cursor cómo obtener valores nulos de columnas
- Encuentra la caja de encuadernación de un conjunto de Geopuntos Mapbox
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.
- ¿Puede Android MediaCodec decodificar video stream h264?
- Excepción OutOfMemory en la conversión de ByteArray a String?