Android - AnimationDrawable闪烁白洞同时播放自定义位图drawable

时间:2015-10-09 06:38:18

标签: android android-drawable animationdrawable

我编写自定义ImageView以显示包含位图列表的动画。这是我的源代码:

public class CustomImageView extends ImageView {
    public CustomImageView(Context context) {
        super(context);
    }
    public void startAnimation(List<BitmapDrawable> arrBitmapDelay, int[] durations) {
        if (arrBitmapDelay.size() > 1 && arrBitmapDelay.size() == durations.length) {
            final AnimationDrawable oAnimation = new AnimationDrawable();
            oAnimation.setOneShot(false);

            int i = 0;
            for (BitmapDrawable oBitmapDelay : arrBitmapDelay) {
                oAnimation.addFrame(oBitmapDelay, durations[i]);
                i++;
            }

            if(getContext() instanceof Activity)
                if(((Activity)getContext()).isFinishing())
                    return;
            if(oAnimation.getNumberOfFrames()<=0) return;

            setImageDrawable(oAnimation);
            post(new Runnable() {
                @Override
                public void run() {
                    oAnimation.start();
                }
            });

        }
    }
}

结果:https://goo.gl/photos/FSC5RaEE2ajfe23v6

你可以看到,它正确地循环时间,但有时会闪烁......请帮忙!

修改

我添加了阅读列表位图的代码。

public void decodeAndShow() {
    List<Bitmap> bitmaps = new ArrayList<>();
    int[] duration = new int[20];
    for (int i=0; i<20; i++) {
        bitmaps.add(BitmapFactory.decodeFile(new File(getContext().getCacheDir(), "bitmapsample"+i+".png").getAbsolutePath()));
        duration[i] = 100;
    }
    img.startAnimation(bitmaps, duration);
}

抱歉,因为我的项目复制得太复杂了。

2 个答案:

答案 0 :(得分:0)

添加android:hardwareAccelerated =&#34; true&#34;到你的清单,无论是为了还是为了。这可以确保您的应用使用设备图形卡,并且可以帮助您制作动画。

答案 1 :(得分:0)

我自己做了一个骗子。我不知道为什么会这样。

这是我的代码:

public class CustomImageView extends ImageView {
    private Runnable runningAnimation;
    public CustomImageView(Context context) {
        super(context);
    }
    public void startAnimation(List<BitmapDrawable> arrBitmapDelay, int[] durations) {
        if(runningAnimation != null) {
            this.removeCallbacks(runningAnimation);
        }
        if (arrBitmapDelay.size() > 1 && arrBitmapDelay.size() == durations.length) {
            final AnimationDrawable oAnimation = new AnimationDrawable();
            oAnimation.setOneShot(false);

            int i = 0;
            for (BitmapDrawable oBitmapDelay : arrBitmapDelay) {
                oAnimation.addFrame(oBitmapDelay, durations[i]);
                i++;
            }

            if(getContext() instanceof Activity)
                if(((Activity)getContext()).isFinishing())
                    return;
            if(oAnimation.getNumberOfFrames()<=0) return;

            setImageDrawable(oAnimation);
            runningAnimation = new Runnable() {
                @Override
                public void run() {
                    oAnimation.start();
                }
            }
            post(runningAnimation);

        }
    }
}