As the title elaborates I need to implement a way of showing gif images as a sequence in a single imageview container.
the things i have tried so far:
used glide library and found no luck with it since they are using some weird internal threading mechanism to animate gifs so making a sequence is not possible with it.
then i used android-gif-drawable library and found some piece of code but still couldn't manage it to work. below i have posted the class used to create this ChainedGifDrawable custom drawable. any help would be highly appreciated in this.
public static class ChainedGifDrawable extends Drawable implements AnimationListener {
private final pl.droidsonroids.gif.GifDrawable[] mDrawables;
private int mCurrentIndex;
public ChainedGifDrawable(List<pl.droidsonroids.gif.GifDrawable> drawables) {
mDrawables = drawables.toArray(new pl.droidsonroids.gif.GifDrawable[0]);
for (pl.droidsonroids.gif.GifDrawable drawable : drawables) {
drawable.addAnimationListener(this);
}
}
@Override
public void onAnimationCompleted(int loopNumber) {
Log.e("Called ","Checked");
mCurrentIndex++;
mCurrentIndex %= mDrawables.length;
mDrawables[mCurrentIndex].setCallback(getCallback());
mDrawables[mCurrentIndex].invalidateSelf();
}
@Override
public void invalidateSelf() {
mDrawables[mCurrentIndex].invalidateSelf();
Log.e("Called invalidateSelf "+mCurrentIndex ,"Checked");
}
@Override
public void scheduleSelf(@NonNull Runnable what, long when) {
mDrawables[mCurrentIndex].scheduleSelf(what, when);
Log.e("Called scheduleSelf "+mCurrentIndex ,"Checked");
}
@Override
public void unscheduleSelf(@NonNull Runnable what) {
mDrawables[mCurrentIndex].unscheduleSelf(what);
Log.e("Called unscheduleSelf "+mCurrentIndex ,"Checked");
}
@Override
public int getIntrinsicWidth() {
Log.e("Called getIntrinsicWidth "+mCurrentIndex ,"Checked");
return mDrawables[mCurrentIndex].getIntrinsicWidth();
}
@Override
public int getIntrinsicHeight() {
Log.e("Called getIntrinsicHeight "+mCurrentIndex ,"Checked");
return mDrawables[mCurrentIndex].getIntrinsicHeight();
}
@Override
protected void onBoundsChange(Rect bounds) {
for (pl.droidsonroids.gif.GifDrawable drawable : mDrawables) {
drawable.setBounds(bounds);
}
Log.e("Called onboundsChange "+mCurrentIndex ,"Checked");
}
@Override
public void draw(@NonNull Canvas canvas) {
mDrawables[mCurrentIndex].draw(canvas);
Log.e("Called draw "+mCurrentIndex ,"Checked");
}
@Override
public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
for (pl.droidsonroids.gif.GifDrawable drawable : mDrawables) {
drawable.setAlpha(alpha);
}
Log.e("Called setAlpha "+mCurrentIndex ,"Checked");
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
for (pl.droidsonroids.gif.GifDrawable drawable : mDrawables) {
drawable.setColorFilter(colorFilter);
}
Log.e("Called setcolorfilter "+mCurrentIndex ,"Checked");
}
@Override
public int getOpacity() {
Log.e("Called getOpacity "+mCurrentIndex ,"Checked");
return PixelFormat.TRANSLUCENT;
}
public void setAnimationEnabled() {
mDrawables[0].setCallback(getCallback());
}
}