Android 按钮呼吸灯效果

本文介绍如何通过自定义View实现按钮的呼吸灯效果。利用Alpha动画让背景颜色在透明与不透明间循环变化,并通过Handler和Timer实现动画的自动切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写代码片公司要求做在按钮上做一个呼吸灯的效果,想了一下,可以做一个北京,背景执行动画,让他循环的消失和出现,首先要做两个动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true" >
    <alpha
        android:duration="1500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

</set>

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true" >
    <alpha
        android:duration="1500"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

然后就是自己包装了一下的imageview

public class loopPicture extends ImageView{
    private Context mContext;
    private ImageView breathImageView;
    private Timer timer;
    private boolean isOpen = true;
    private int index = 0;
    private final int BREATH_INTERVAL_TIME = 1000; //设置呼吸灯时间间隔
    public Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    breathImageView.clearAnimation();
                    breathImageView.setAnimation(getFadeIn());
                    break;
                case 2:
                    breathImageView.clearAnimation();
                    breathImageView.setAnimation(getFadeOut());
                    break;
            }
            super.handleMessage(msg);
        }
    };

    public loopPicture(Context context) {
        super(context);
        this.mContext=context;
        breathImageView=this;
        startTimer();
    }
    public loopPicture(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext=context;
        breathImageView=this;
        startTimer();
    }

    public loopPicture(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mContext=context;
        breathImageView=this;
        startTimer();
    }

    private Animation getFadeIn() {
        Animation fadeIn = AnimationUtils.loadAnimation(mContext,
                R.anim.alpha_fade_in);
        fadeIn.setDuration(BREATH_INTERVAL_TIME);
        fadeIn.setStartOffset(100);
        return fadeIn;
    }

    private Animation getFadeOut() {
        Animation fadeOut = AnimationUtils.loadAnimation(mContext,
                R.anim.alpha_fade_out);
        fadeOut.setDuration(BREATH_INTERVAL_TIME);
        fadeOut.setStartOffset(100);
        return fadeOut;
    }

    private void startTimer() {
        timer = new Timer(true);
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                if (isOpen) {
                    if (index == 2) {
                        index = 0;
                    }
                    index++;
                    Message message = new Message();
                    message.what = index;
                    handler.sendMessage(message);
                }
            }
        };
        timer.schedule(task, 0, BREATH_INTERVAL_TIME); // 延时0ms后执行,5000ms执行一次
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值