Android呼吸灯效果两种实现

最近项目要做个呼吸灯实现,有两种方式,实现呼吸灯效果本质上都是使用ImageView动画,实现alpha值变化。

第一种方式,直接使用动画实现,代码如下:

    private final int BREATH_INTERVAL_TIME = 1000; //设置呼吸灯时间间隔
    private AlphaAnimation animationFadeIn;
    private AlphaAnimation animationFadeOut;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mode_select_layout);
        breathImageView = (ImageView)findViewById(R.id.breathImageView);

        animationFadeIn = new AlphaAnimation(0.1f, 1.0f);
        animationFadeIn.setDuration(BREATH_INTERVAL_TIME);
//        animationFadeIn.setStartOffset(100);

        animationFadeOut = new AlphaAnimation(1.0f, 0.1f);
        animationFadeOut.setDuration(BREATH_INTERVAL_TIME);
//        animationFadeIn.setStartOffset(100);

        animationFadeIn.setAnimationListener(new Animation.AnimationListener(){

            @Override
            public void onAnimationEnd(Animation arg0) {
                breathImageView.startAnimation(animationFadeOut);
            }

            @Override
            public void onAnimationRepeat(Animation arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationStart(Animation arg0) {
                // TODO Auto-generated method stub

            }

        });

        animationFadeOut.setAnimationListener(new Animation.AnimationListener(){

            @Override
            public void onAnimationEnd(Animation arg0) {
                breathImageView.startAnimation(animationFadeIn);
            }

            @Override
            public void onAnimationRepeat(Animation arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationStart(Animation arg0) {
                // TODO Auto-generated method stub

            }

        });
        breathImageView.startAnimation(animationFadeOut);

    }

第二种方式,使用timer实现,代码如下:

增加动画alpha_fade_in.xml

<?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>
alpha_fade_out.xml

<?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>

Activity中代码:

private ImageView breathImageView;
private Timer timer;
private boolean isOpen = true;
private int index = 0;
private final int BREATH_INTERVAL_TIME = 1000; //设置呼吸灯时间间隔


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mode_select_layout);
    breathImageView = (ImageView)findViewById(R.id.breathImageView);
    startTimer();
}
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);
    }
};

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

private Animation getFadeOut() {
    Animation fadeOut = AnimationUtils.loadAnimation(ModeSelectPage.this,
            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执行一次
}

@Override
protected void onDestroy() {

    isOpen = false;
    if (timer != null) {
        timer.cancel();// 退出计时器
    }
    timer = null;

    super.onDestroy();

}


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android实现呼吸灯效果,可以通过使用ValueAnimator来实现。具体实现步骤如下: 1. 创建一个View,设置其背景色为需要的颜色。 2. 创建一个ValueAnimator对象,设置动画时长、循环次数、动画插值器等属性。 3. 在ValueAnimator的监听器中,实现对View的背景色进行动态修改,从而实现呼吸灯效果。 以下是示例代码: ``` public class BreathingLightView extends View { private int mColor; private Paint mPaint; private ValueAnimator mAnimator; private int mAlpha; public BreathingLightView(Context context) { this(context, null); } public BreathingLightView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BreathingLightView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mPaint.setAntiAlias(true); mColor = Color.parseColor("#FF4081"); mAnimator = ValueAnimator.ofInt(0, 255); mAnimator.setDuration(2000); mAnimator.setRepeatCount(ValueAnimator.INFINITE); mAnimator.setRepeatMode(ValueAnimator.REVERSE); mAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mAlpha = (int) animation.getAnimatedValue(); mPaint.setColor(Color.argb(mAlpha, Color.red(mColor), Color.green(mColor), Color.blue(mColor))); invalidate(); } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); mPaint.setColor(Color.argb(mAlpha, Color.red(mColor), Color.green(mColor), Color.blue(mColor))); canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, mPaint); } public void startBreathing() { if (mAnimator != null && !mAnimator.isStarted()) { mAnimator.start(); } } public void stopBreathing() { if (mAnimator != null && mAnimator.isStarted()) { mAnimator.end(); } } } ``` 在Activity中,可以通过以下方式来使用BreathingLightView: ``` public class MainActivity extends AppCompatActivity { private BreathingLightView mBreathingLightView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBreathingLightView = findViewById(R.id.breathing_light_view); mBreathingLightView.startBreathing(); } @Override protected void onDestroy() { super.onDestroy(); mBreathingLightView.stopBreathing(); } } ``` 其中,activity_main.xml中的布局代码如下: ``` <com.example.myapplication.BreathingLightView android:id="@+id/breathing_light_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center" android:background="@android:color/white" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值