安卓 java 窗帘带进度的开关动画
时间: 2023-10-22 21:22:53 浏览: 79
以下是一个基本的窗帘带进度的开关动画的示例代码:
```
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
public class CurtainSwitchView extends View {
private static final int ANIMATION_DURATION = 500;
private Paint mPaint;
private int mWidth;
private int mHeight;
private boolean mIsOn = false;
private float mProgress = 0f;
public CurtainSwitchView(Context context) {
super(context);
init();
}
public CurtainSwitchView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CurtainSwitchView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.WHITE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = getResources().getDimensionPixelSize(R.dimen.curtain_switch_width);
int desiredHeight = getResources().getDimensionPixelSize(R.dimen.curtain_switch_height);
mWidth = Math.max(desiredWidth, MeasureSpec.getSize(widthMeasureSpec));
mHeight = Math.max(desiredHeight, MeasureSpec.getSize(heightMeasureSpec));
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
float curtainWidth = mWidth / 2f;
float curtainHeight = mHeight * 0.8f;
float curtainTop = (mHeight - curtainHeight) / 2f;
canvas.save();
canvas.translate(mWidth / 2f, 0);
float left = -curtainWidth / 2f;
float right = curtainWidth / 2f;
float top = curtainTop;
float bottom = top + curtainHeight;
canvas.drawRect(left, top, right, bottom, mPaint);
float progressHeight = mProgress * curtainHeight;
canvas.drawRect(left, top, right, top + progressHeight, mPaint);
canvas.restore();
}
public boolean isOn() {
return mIsOn;
}
public void setOn(boolean isOn) {
if (mIsOn != isOn) {
mIsOn = isOn;
animateSwitch();
}
}
private void animateSwitch() {
ObjectAnimator animator = ObjectAnimator.ofFloat(this, "progress", 0f, 1f);
animator.setDuration(ANIMATION_DURATION);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (!mIsOn) {
ObjectAnimator animator = ObjectAnimator.ofFloat(CurtainSwitchView.this, "progress", 1f, 0f);
animator.setDuration(ANIMATION_DURATION);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.start();
}
}
});
animator.start();
}
public float getProgress() {
return mProgress;
}
public void setProgress(float progress) {
mProgress = progress;
invalidate();
}
}
```
其中,`CurtainSwitchView` 是一个继承自 `View` 的自定义视图,用于实现窗帘带进度的开关动画。在 `onDraw` 方法中,我们绘制了一个矩形来表示窗帘,然后根据当前进度绘制出窗帘的一部分,从而实现动画效果。在 `animateSwitch` 方法中,我们使用 `ObjectAnimator` 来控制进度的变化,并在动画结束时根据当前开关状态进行反向动画。在 `setOn` 方法中,我们通过调用 `animateSwitch` 方法来触发动画。最后,我们可以通过调用 `setOn` 方法来控制开关的状态,从而触发动画。
阅读全文