Android自定义圆形倒计时进度条
作者:yanzhenjie1003 发布时间:2021-09-11 06:17:08
本文实例为大家分享了Android倒计时进度条展示的具体代码,供大家参考,具体内容如下
效果预览
源代码传送门:https://github.com/yanzhenjie/CircleTextProgressbar
实现与原理
这个文字圆形的进度条我们在很多APP中看到过,比如APP欢迎页倒计时,下载文件倒计时等。
分析下原理,可能有的同学一看到这个自定义View就慌了,这个是不是要继承View啊,是不是要绘制啊之类的,答案是:是的。但是我们也不要担心,实现这个效果实在是so easy。下面就跟我一起来看看核心分析和代码吧。
原理分析
首先我们观察上图,需要几个部分组成:
1. 外面逐渐增加/减少的圆形进度条。
2. 圆形进度条中间的展示文字。
3. 圆形进度条外面包裹的圆。
4. 圆形进度条中间的填充色。
5. 字体颜色/填充颜色点击变色:ColorStateList类。
我们分析得出需要四个部分。一看有文字,那么第一个想到的自然是TextView啦,正好可以少做一个字体颜色的记录。中间的填充颜色(原型暂且不考虑)点击时变色,需要ColorStateList类来记录。剩下的进度条、轮廓圆和填充圆是需要我们绘制的。
我封装的CircleTextProgressbar特色
CircleTextProgressbar支持自动倒计时,自动减少进度,自动增加进度等。
如果需要自动走进度的话,设置完你自定义的属性后调用start()方法就可以自动倒计时了,如果想走完后再走一遍自动进度调用一下reStart()就OK了。
如果不想自动走进度,你可以通过setProgress()来像系统的progress一样修改进度值。
// 和系统普通进度条一样,0-100。
progressBar.setProgressType(CircleTextProgressbar.ProgressType.COUNT);
// 改变进度条。
progressBar.setProgressLineWidth(30);// 进度条宽度。
// 设置倒计时时间毫秒,默认3000毫秒。
progressBar.setTimeMillis(3500);
// 改变进度条颜色。
progressBar.setProgressColor(Color.RED);
// 改变外部边框颜色。
progressBar.setOutLineColor(Color.RED);
// 改变圆心颜色。
progressBar.setInCircleColor(Color.RED);
// 如果需要自动倒计时,就会自动走进度。
progressBar.start();
// 如果想自己设置进度,比如100。
progressBar.setProgress(100);
踩坑的过程
其实好久没有写过自定义View了,有些东西还真忘记了,所以写这个View的时候又把之前的坑踩了一遍,为了避免其它同学也被坑,这里把我踩的坑也记录下。
View绘制区域
这里我遇到一个问题,因为我们继承的TextView文字多了就是长的,那么绘制出来的圆长宽是一样的,所以在TextView上绘制出来的圆只能看到一部分或者是椭圆的。所以我们要把View的绘制区域扩大。当时我第一个想到的是layout()方法,因为当View的父布局onLayout()的时候会调用View的layout()来让子View布局,我重写了layout方法:
@Override
public void layout(int left, int top, int right, int bottom) {
int w = right - left;
int h = bottom - top;
int size = w > h ? w : h;
if (w > h) {
bottom += (size - h);
} else {
right += (size - w);
}
super.layout(left, top, right, bottom);
}
这段代码的原理就是宽和高,那个大,就把view扩大到这么最大的这个值。
当放了一个View在Layout时,效果出来没问题,但是我放多个View到LinearLayout中的时候发现几个View重叠了,哦舍特。我恍然大悟啊,这尼玛人家Layout已经把我绘制区域的宽高指定了,我强行去占领别的View的了。so,我应该重写onMeasure()啊,在测量宽高的时候就告诉父Layout我要多大的地盘:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int size = width > height ? width : height;
setMeasuredDimension(size, size);
}
这段代码的意思更容易理解,就是看super.onMeasure测量的时候的宽高哪个大,就把宽高都设置成最大的这个值。告诉父Layout我要多大的地盘,那么等我绘制的时候我想怎么玩就怎么玩。
绘制View的实现
来源:http://blog.csdn.net/yanzhenjie1003/article/details/51889239


猜你喜欢
- 本文实例为大家分享了winform循环播放多个视频的具体代码,供大家参考,具体内容如下环境: vs2015 +winform首先,vs自带组
- C#调用C++DLL传递结构体数组的终极解决方案在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport
- 我以2018版的intellij idea为例一.创建JavaWeb1.第一步点击左上角的File-->New-->Projec
- 配置Servlet的方法有俩种,分别是传统web.xml文档中部署servlet和注解方式部署servlet,下面就先一起来学习 * 解方式部
- MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱
- 使用包管理器package com.liunan.myfirstapp.util;import android.content.Contex
- 前言本篇内容:提示语的国际化返回,自定义多语言。本文使用aop方式,拦截接口返回的数据,进行转换。正文 先看这次示例教
- 一,使用背景之前遇到一个需求,是需要将一个json文件解析存储到数据库中。一开始测试的时候,json文件的大小都在几兆以内,所以直接将jso
- 一 问题描述小明为位置1,求他到其他各顶点的距离。二 实现package graph.dijkstra;import j
- 前言前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的。先让我们来看
- Caffeine和Spring Boot集成Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将
- 1、如何解决服务之间的通信问题?[1]HTTP REST方式 使用http协议进行数据传递 json格式数据[2]RPC方式 远程过程调用
- java中引用数据类型有哪些Java中有俩种数据类型,其中主要有8中基本数据类型和引用数据类型,除了8中基本数据类型以外都是引用数据类型,8
- 打jar包实现分离依赖lib和配置为了业务需要配置文件和jar分离,便于使用者修改配置信息,在网上找了很久,最终找到一个简单有效的方法。操作
- Android自定义短信验证码组件,供大家参考,具体内容如下效果图1.布局实现因为要禁用光标,所以我用TextView代替了EditText
- IoC的概念介绍控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控
- 一、系统启动后注入配置package com.example.config;import org.springframework.beans
- 访问静态资源遇到的坑及解决开始是以这种结构进行的,结果页面上一篇红,访问的页面是这样的最终找出来问题,虽然每次调整路径都不对,最终查看多种方
- 实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个
- 为了解决以下两个问题:1、单JAR包应用查看日志需要的时候如果需要远程访问服务器登录查看日志,那样相对比较麻烦2、生产环境为了解决BUG需要