android - ¿Hay alguna alternativa CircleImageView con soporte de TransitionAnimation?
transitiondrawable (1)
Tengo ImageView. Después de cargar el mapa de bits en onPostExecute llamo a setImageDrawable para llenar imageView (uso CircleImageView) con imagen. Pero TransitionDrawable muestra solo la primera imagen y no se ejecuta ninguna transacción. ¿Cómo hago que esto funcione? Gracias por adelantado.
private void setImageDrawable(ImageView imageView, Bitmap bitmap) {
if (mFadeInBitmap) {
BitmapDrawable drawable = null, placeholder = null;
if (bitmap != null) {
drawable = new BitmapDrawable(mResources, bitmap);
placeholder = new BitmapDrawable(mResources, mPlaceHolderBitmap);
}
final TransitionDrawable td =
new TransitionDrawable(new Drawable[] {
placeholder,
drawable,
});
imageView.setImageDrawable(td);
td.startTransition(200);
} else {
imageView.setImageBitmap(bitmap);
}
}
ACTUALIZACIÓN: He encontrado la solución por la que no funciona para mí en la documentación de CircleImageView: "El uso de TransitionDrawable con CircleImageView no funciona correctamente y genera imágenes en mal estado" ( https://github.com/hdodenhof/CircleImageView). )
Entonces, ¿alguien puede sugerirme la forma en que puedo obtener la imagen del círculo con fade en la animación funcionando correctamente?
ACTUALIZACIÓN 2: La solución que he encontrado para obtener una transición fluida entre dos imágenes circulares es desvanecer la primera y luego desvanecer la segunda con Animación y publicar demorada. Aquí está el ejemplo del código.
fade_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="100"
android:interpolator="@android:anim/accelerate_interpolator"
/>
</set>
fade_in.xml casi idéntico excepto que cambias de Alfa a Alfa por lugares. Después de eso, aplica estas animaciones a la vista de imagen de tu círculo, así:
Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.fade_out);
imageView.startAnimation(anim);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(value);//changing to different image ,here you will set image that you have loaded
Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.fade_in);
imageView.startAnimation(anim);
}
}, 100);
Espero que sea útil.
He intentado el siguiente código y puedo decir que funciona y la transición es más o menos visible:
private void setImageDrawable(ImageView imageView) {
Bitmap bitmap1 = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Bitmap bitmap2 = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
new Canvas(bitmap1).drawRect(0, 0, 100, 100, mWhitePaint);
new Canvas(bitmap2).drawRect(0, 0, 100, 100, mBlackPaint);
BitmapDrawable drawable1 = new BitmapDrawable(getResources(), bitmap1);
BitmapDrawable drawable2 = new BitmapDrawable(getResources(), bitmap2);
TransitionDrawable transitionDrawable = new TransitionDrawable(new Drawable[] {drawable1, drawable2});
imageView.setImageDrawable(transitionDrawable);
transitionDrawable.startTransition(3000);
}
Compruebe que su bitmap
no sea null
y que sea diferente de mPlaceHolderBitmap
(que tampoco debería ser null
). También intente establecer la duración de transición en 3 segundos, por ejemplo, porque tal vez 200 ms es demasiado rápido para ver la transición en sí.