千家信息网

android如何自定义圆形倒计时显示控件

发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,这篇文章主要为大家展示了"android如何自定义圆形倒计时显示控件",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"android如何自定义圆形倒计时显示控
千家信息网最后更新 2025年11月17日android如何自定义圆形倒计时显示控件

这篇文章主要为大家展示了"android如何自定义圆形倒计时显示控件",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"android如何自定义圆形倒计时显示控件"这篇文章吧。

代码块

attr.xml 控件需要用到的属性:

CountDownView.java

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; private OnCountDownFinishListener mListener; 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); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CountDownView); mRingColor = a.getColor(R.styleable.CountDownView_ringColor, context.getResources().getColor(R.color.colorAccent)); mRingWidth = a.getFloat(R.styleable.CountDownView_ringWidth, 40); mRingProgessTextSize = a.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize, DisplayUtils.sp2px(context, 20)); mProgessTextColor = a.getColor(R.styleable.CountDownView_progressTextColor, context.getResources().getColor(R.color.colorAccent)); mCountdownTime = a.getInteger(R.styleable.CountDownView_countdownTime, 60); a.recycle(); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setAntiAlias(true); this.setWillNotDraw(false); } public void setCountdownTime(int mCountdownTime) { this.mCountdownTime = mCountdownTime; } @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); } @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); } private ValueAnimator getValA(long countdownTime) { ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100); valueAnimator.setDuration(countdownTime); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setRepeatCount(0); return valueAnimator; } /** * 开始倒计时 */ public void startCountDown() { setClickable(false); ValueAnimator valueAnimator = getValA(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(); } setClickable(true); } }); } public void setAddCountDownListener(OnCountDownFinishListener mListener) { this.mListener = mListener; } public interface OnCountDownFinishListener { void countDownFinished(); }}

MainActivity.java

package com.ouyuan.demo.myapplication;import android.animation.ValueAnimator;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity { CountDownView cdv; TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cdv = (CountDownView) findViewById(R.id.countDownView); cdv.setAddCountDownListener(new CountDownView.OnCountDownFinishListener() { @Override public void countDownFinished() { Toast.makeText(MainActivity.this, "倒计时结束", Toast.LENGTH_SHORT).show(); } }); cdv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { cdv.startCountDown(); } }); }}

以上是"android如何自定义圆形倒计时显示控件"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

倒计时 控件 圆形 内容 宽度 篇文章 圆环 文本 颜色 学习 帮助 代码 区域 大小 属性 文字 易懂 更多 条理 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云台山天气预报软件开发 中国民航导航数据库管理培训 手机显示服务器忙怎么操作 厦门曼音网络技术有限公司 我的世界海战服务器 金仓数据库兼容哪些操作系统 戴尔服务器作用 弱电工程服务器维修地址 大学生软件开发实训报告 拍卖软件开发需要多少钱 网络安全吧严禁 金立m5无法连接服务器 临猗奖舅网络技术有限公司 软件开发公司重要还是程序猿 软件开发项目经费预算怎么写 安全的数据库客户端支持安全管理 怎么登陆自己的腾讯云服务器 视频数据库是不是多媒体资源 山西国贸网络安全部门 网络安全问题咨询 云台山天气预报软件开发 富士通服务器客服电话 数据库外键约束的主表是哪个 redis 多个数据库 桌面软件开发技术路线 使用数据库gui时 国内数据库技术培训知名机构 参加网络安全视频培训 通信网络技术岗 sql语句应用在那些数据库
0