android实现圆环倒计时控件

作者:旺仔哥 时间:2021-12-15 20:55:54 

本文实例为大家分享了android实现圆环倒计时控件的具体代码,供大家参考,具体内容如下

android实现圆环倒计时控件

1.自定义属性


<?xml version="1.0" encoding="utf-8"?>
<resources>

<!-- 倒计时控件属性 -->
<declare-styleable name="CountDownView">
<!--颜色-->
<attr name="ringColor" format="color" />
<!-- 进度文本的字体大小 -->
<attr name="progressTextSize" format="dimension" />
<!-- 圆环宽度 -->
<attr name="ringWidth" format="float" />
<!--进度文本颜色-->
<attr name="progressTextColor" format="color"/>
<!--倒计时-->
<attr name="countdownTime" format="integer"/>
</declare-styleable>
</resources>

2.自定义view


public class CountDownView extends View {
//圆环颜色
private int mRingColor;
//圆环宽度
private float mRingWidth;
//圆环进度值文本大小
private int mRingProgessTextSize;
//宽度
private int mWidth;
//高度
private int mHeight;
private Paint mPaint;
//圆环的矩形区域
private RectF mRectF;
//
private int mProgessTextColor;
private int mCountdownTime;
private float mCurrentProgress;

ValueAnimator valueAnimator;

/**
* 监听事件
*/
private OnCountDownListener mListener;

public CountDownView(Context context) {
this(context, null);

}

public CountDownView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);

}

public CountDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// init();

/**
* 获取相关属性值
*/
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CountDownView);
mRingColor = typedArray.getColor(R.styleable.CountDownView_ringColor, context.getResources().getColor(R.color.colorAccent));
mRingWidth = typedArray.getFloat(R.styleable.CountDownView_ringWidth, 40);
mRingProgessTextSize = typedArray.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize, 20);
mProgessTextColor = typedArray.getColor(R.styleable.CountDownView_progressTextColor, context.getResources().getColor(R.color.colorAccent));
mCountdownTime = typedArray.getInteger(R.styleable.CountDownView_countdownTime, 60);
typedArray.recycle();
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setAntiAlias(true);
this.setWillNotDraw(false);

}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mWidth = getMeasuredWidth();
mHeight = getMeasuredHeight();

mRectF = new RectF(0 + mRingWidth / 2, 0 + mRingWidth / 2,
mWidth - mRingWidth / 2, mHeight - mRingWidth / 2);
}

/**
* 设置倒计时间 单位秒
* @param mCountdownTime
*/
public void setCountdownTime(int mCountdownTime) {
this.mCountdownTime = mCountdownTime;

invalidate();

}

// public CountDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
// super(context, attrs, defStyleAttr, defStyleRes);
// }

/**
* 动画
* @param countdownTime
* @return
*/
private ValueAnimator getValueAnimator(long countdownTime) {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);
valueAnimator.setDuration(countdownTime);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setRepeatCount(0);
return valueAnimator;
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

/**
*圆环
*/
//颜色
mPaint.setColor(mRingColor);
//空心
mPaint.setStyle(Paint.Style.STROKE);
//宽度
mPaint.setStrokeWidth(mRingWidth);
canvas.drawArc(mRectF, -90, mCurrentProgress - 360, false, mPaint);
//绘制文本
Paint textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setTextAlign(Paint.Align.CENTER);
String text = mCountdownTime - (int) (mCurrentProgress / 360f * mCountdownTime) + "";
textPaint.setTextSize(mRingProgessTextSize);
textPaint.setColor(mProgessTextColor);

//文字居中显示
Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt();
int baseline = (int) ((mRectF.bottom + mRectF.top - fontMetrics.bottom - fontMetrics.top) / 2);
canvas.drawText(text, mRectF.centerX(), baseline, textPaint);
}

/**
* 开始倒计时
*/
public void startCountDown() {
valueAnimator = getValueAnimator(mCountdownTime * 1000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float i = Float.valueOf(String.valueOf(animation.getAnimatedValue()));
mCurrentProgress = (int) (360 * (i / 100f));
invalidate();
}
});
valueAnimator.start();
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
//倒计时结束回调
if (mListener != null) {
 mListener.countDownFinished();
}
}

});
}

/**
* 停止倒计时
*/
public void stopCountDdwn(){

valueAnimator.cancel();

}
public void setOnCountDownListener(OnCountDownListener mListener) {
this.mListener = mListener;
}
}

3.布局文件


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<demo.com.countdowndemo.CountDownView
android:id="@+id/countDownView"
android:layout_width="50dp"
android:layout_height="50dp"
app:countdownTime="5"
app:ringWidth="2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

4.Activity


public class MainActivity extends AppCompatActivity {

CountDownView countDownView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

countDownView = findViewById(R.id.countDownView);

countDownView.setOnCountDownListener(new OnCountDownListener() {
@Override
public void countDownFinished() {
//倒计时结束
//countDownView.setCountdownTime(10);

Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
}
});

countDownView.startCountDown();

countDownView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
countDownView.stopCountDdwn();
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
}
});
}
}

来源:https://blog.csdn.net/wangwangli6/article/details/79933356

标签:android,倒计时
0
投稿

猜你喜欢

  • java 自动生成略缩图示例代码

    2021-11-11 01:27:37
  • C#中参数个数可变的方法实例分析

    2022-12-16 20:02:32
  • Android封装高德地图定位工具类Util的详细步骤

    2022-09-10 10:23:17
  • C#基础:基于const与readonly的深入研究

    2023-09-26 14:22:30
  • 基于springboot 长轮询的实现操作

    2022-02-06 09:46:22
  • Android10填坑适配指南(实际经验代码)

    2022-10-05 19:51:19
  • HashMap 和 Hashtable的区别

    2022-11-01 06:34:47
  • Spring Boot配置Thymeleaf(gradle)的简单使用

    2023-04-18 07:41:42
  • Java实现获取指定个数的不同随机数

    2023-11-14 21:42:34
  • Android开发中判断手机是否安装了QQ或者微信

    2022-01-09 08:44:24
  • winform实现可拖动的自定义Label控件

    2022-12-14 09:11:36
  • 基于hibernate框架在eclipse下的配置方法(必看篇)

    2022-11-09 20:30:26
  • 基于Java数组实现循环队列的两种方法小结

    2023-06-30 16:09:01
  • Flutter简洁实用的图片编辑器的实现

    2021-10-31 08:30:44
  • java算法题解牛客BM99顺时针旋转矩阵示例

    2021-07-08 18:55:18
  • 轻松掌握Java建造者模式

    2023-11-06 15:24:38
  • java获取当前时间并格式化代码实例

    2021-10-06 17:06:16
  • SpringBoot使用swagger生成api接口文档的方法详解

    2021-10-22 18:11:48
  • java注解结合aspectj AOP进行日志打印的操作

    2023-10-23 14:02:53
  • SpringBoot处理接口幂等性的两种方法详解

    2021-12-23 10:32:32
  • asp之家 软件编程 m.aspxhome.com