ImageView以淡入淡出的方式切换显示的图片

效果如下图,ImageView在我们提供的一组图片中不断以淡入淡出的动画切换显示。实现起来也很简单,主要用到的就是线程,每隔一个特定时间切换下一张图片。

ImageView以淡入淡出的方式切换显示的图片_第1张图片

这里我们直接自定义一个ImageView,在里面实现一个线程用于定时切换图片。同时对外提供方法用于设置图片、启动任务以及一些额外的设置。
来不及了,直接上代码:

public class AutoSwitchImageView extends ImageView {
    private int[] images;
    private int index;
    private MyTask task;
    private boolean isCircle;

    private static final long AUTO_SWITCH_TIME = 1500;

    public AutoSwitchImageView(Context context) {
        super(context, null);

    }

    public AutoSwitchImageView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
    }

    public AutoSwitchImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    public class MyTask implements Runnable {


        @Override
        public void run() {
            if (index == images.length - 1 && !isCircle) {
                removeCallbacks(this);
                return;
            }
            switchWithAnim(this);
        }

        public void start() {
            postDelayed(this, AUTO_SWITCH_TIME);
        }
    }

    /**
     * 执行动画实现图片的切换
     * @param task
     */
    private void switchWithAnim(final MyTask task) {
        AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
        alphaAnimation.setFillAfter(true);
        alphaAnimation.setDuration(830);
        startAnimation(alphaAnimation);
        alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (index == images.length - 1 && isCircle) {
                    index = -1;
                }
                setImageResource(images[++index]);
                AlphaAnimation anim = new AlphaAnimation(0, 1);
                anim.setDuration(830);
                anim.setFillAfter(true);
                startAnimation(anim);
                anim.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {

                        postDelayed(task, AUTO_SWITCH_TIME);

                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {

                    }
                });
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

    /**
     * 设置图片数据
     * @param images
     * @return
     */
    public AutoSwitchImageView setImages(int[] images) {
        this.images = images;
        if (images != null && images.length > 0) {
            setImageResource(images[index]);
        }
        return this;
    }

    /**
     * 启动线程,执行任务
     */
    public void startTask() {
        if (images == null || images.length == 0) {
            return;
        }
        if (task != null) {
            removeCallbacks(task);
            task = null;
        }
        task = new MyTask();
        task.start();
    }

    /**
     * 设置是否循环切换图片 
     * @param isCircle 
     * @return
     */
    public AutoSwitchImageView setIsCircle(boolean isCircle) {
        this.isCircle = isCircle;
        return this;
    }
}

在Activity中调用:

 AutoSwitchImageView autoImage = (AutoSwitchImageView) findViewById(R.id.iv);
 autoImage.setImages(images).setIsCircle(true).startTask();

就是这么简单。
如果大家发现有问题或错误还望指正,反正我也不会改,哈哈哈哈哈。

你可能感兴趣的:(Android进阶)