android 倒计时动画
时间: 2023-06-30 11:17:31 浏览: 72
要在 Android 上实现倒计时动画,可以参考以下步骤:
1. 创建一个自定义 View,并在其中实现倒计时动画的绘制逻辑。
2. 在 View 中添加一个计时器,每隔一段时间更新倒计时的数值,并调用 invalidate() 方法刷新界面。
3. 在绘制逻辑中,根据当前的倒计时数值计算出圆环的弧度,并使用 Canvas 绘制圆环和数字。
4. 可以添加一些动画效果,例如圆环的渐变填充色、数字的放大缩小等等,增强视觉效果。
以下是一个简单的示例代码,仅供参考:
```
public class CountDownView extends View {
private static final long COUNT_DOWN_INTERVAL = 1000; // 倒计时间隔,默认为 1 秒
private static final int DEFAULT_COUNT_DOWN_TIME = 60; // 默认倒计时时间为 60 秒
private Paint mPaint;
private RectF mRectF;
private float mSweepAngle;
private int mCountDownTime;
private long mStartTime;
private boolean mIsCountingDown;
public CountDownView(Context context) {
this(context, null);
}
public CountDownView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CountDownView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 初始化画笔
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(10);
// 初始化圆弧矩形
mRectF = new RectF();
// 初始化倒计时时间
mCountDownTime = DEFAULT_COUNT_DOWN_TIME;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 计算圆弧矩形
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = Math.min(width, height);
int padding = 10;
mRectF.set(padding, padding, size - padding, size - padding);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制圆弧
mPaint.setColor(Color.GRAY);
canvas.drawArc(mRectF, 0, 360, false, mPaint);
mPaint.setColor(Color.BLUE);
canvas.drawArc(mRectF, -90, mSweepAngle, false, mPaint);
// 绘制数字
mPaint.setColor(Color.BLACK);
mPaint.setTextSize(50);
String text = String.valueOf(mCountDownTime);
Rect textBounds = new Rect();
mPaint.getTextBounds(text, 0, text.length(), textBounds);
canvas.drawText(text, mRectF.centerX() - textBounds.width() / 2,
mRectF.centerY() + textBounds.height() / 2, mPaint);
}
public void startCountDown() {
if (mIsCountingDown) {
return;
}
mIsCountingDown = true;
mStartTime = System.currentTimeMillis();
post(countDownRunnable);
}
public void stopCountDown() {
mIsCountingDown = false;
removeCallbacks(countDownRunnable);
}
private Runnable countDownRunnable = new Runnable() {
@Override
public void run() {
long elapsedTime = System.currentTimeMillis() - mStartTime;
int remainingTime = mCountDownTime - (int) (elapsedTime / COUNT_DOWN_INTERVAL);
if (remainingTime >= 0) {
mSweepAngle = (float) remainingTime / mCountDownTime * 360;
invalidate();
postDelayed(this, COUNT_DOWN_INTERVAL);
} else {
stopCountDown();
}
}
};
}
```
使用时可以调用 startCountDown() 方法开始倒计时,调用 stopCountDown() 方法停止倒计时。