首先,感谢公司能给我闲暇的时间,来稳固我的技术,让我不断的去探索研究,在此不胜感激。

先不说实现功能,上图看看效果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3ByaW5nc2t5Xw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">这个是续上一次水平变色进度条的有一个全新的控件,理论实现原理

1.分析控件:该控件基本上是圆圈内嵌圆圈;

2.进度计算:事实上是小学二年级数学题:当前进度/总数=百分比;

3.中间时间:呵呵,纯粹忽悠,不解释(当前时间)。

理论总是和实践差距的太远。不扯淡。不吹嘘,贴代码:

package com.spring.progressview;

import java.text.SimpleDateFormat;
import java.util.Date; import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View; /****
* 圆圈进度控件
* @author spring sky
* Email:vipa1888@163.com
* 下载地址:http://download.csdn.net/detail/vipa1888/7637905
*/
public class RoundProgressView extends View { /**最外围的颜色值*/
private int mOutRoundColor = Color.argb(60, 255, 255, 255);
/**中心圆的颜色值*/
private int mCenterRoundColor = Color.argb(255, 255, 255, 255); /**进度的颜色*/
private int mProgressRoundColor = Color.argb(255, 255, 255, 255);
/**进度的背景颜色*/
private int mProgressRoundBgColor = Color.argb(100, 255, 255, 255);
/**进度条的宽度*/
private int mProgressWidth = 5; private int[] colors = {Color.WHITE,Color.RED};
/***字体颜色*/
private int mTextColor = Color.rgb(118, 181, 66);
private float mPencentTextSize = 65; private int mWidth,mHeight;
private int mPaddingX; private float mProgress = 0.5f;
private float mMax = 1.0f;
/**
* 时间显示格式
*/
private SimpleDateFormat mDateFormat = new SimpleDateFormat("HH:mm:ss.S"); private Paint mPaint = new Paint(); public RoundProgressView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} public RoundProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public RoundProgressView(Context context) {
super(context);
init();
} public void init(){
} @SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mWidth = getWidth();
mHeight = getHeight(); if(mWidth > mHeight){
mPaddingX = (mWidth-mHeight)/2;
mWidth = mHeight;
}
mPaint.setAntiAlias(true); // 消除锯齿
mPaint.setStyle(Style.FILL);
mPaint.setColor(mOutRoundColor);
RectF oval = new RectF(new Rect(mPaddingX, 0, mWidth+mPaddingX, mHeight));
canvas.drawArc(oval, 0, 360, true, mPaint); int halfWidth = mWidth/6;
mPaint.setColor(mProgressRoundBgColor);
mPaint.setStrokeWidth(mProgressWidth);
mPaint.setStyle(Style.STROKE);
oval = new RectF(new Rect(halfWidth+mPaddingX, halfWidth, halfWidth*5+mPaddingX, halfWidth*5));
canvas.drawArc(oval, 0, 360, false, mPaint); mPaint.setColor(mProgressRoundColor);
canvas.drawArc(oval, 90, 360*mProgress/mMax, false, mPaint); halfWidth = mWidth/4;
mPaint.setStyle(Style.FILL);
mPaint.setColor(mCenterRoundColor);
oval = new RectF(new Rect(halfWidth+mPaddingX, halfWidth, halfWidth*3+mPaddingX, halfWidth*3));
canvas.drawArc(oval, 0, 360, false, mPaint); mPaint.reset();
mPaint.setTextSize(mPencentTextSize);
mPaint.setColor(mTextColor);
mPaint.setStyle(Style.FILL);
mPaint.setTextAlign(Align.CENTER);
String number = (int)(mProgress*100/mMax)+"";
canvas.drawText(number, mWidth/2+mPaddingX, mHeight/2+mPencentTextSize/3, mPaint); float textWidth = mPaint.measureText(number);
mPaint.setTextSize(mPencentTextSize/2);
canvas.drawText("%", mWidth/2+mPaddingX+textWidth/2+5, mHeight/2-mPencentTextSize/8, mPaint); mPaint.setTextSize(mPencentTextSize/2);
canvas.drawText(mDateFormat.format(new Date(System.currentTimeMillis())), mWidth/2+mPaddingX, mHeight/2+halfWidth/4*3, mPaint);
} public void setMax(float mMax) {
this.mMax = mMax;
} public void setProgress(float mProgress) {
this.mProgress = mProgress;
invalidate();
} public float getMax() {
return mMax;
} public float getProgress() {
return mProgress;
} }

尽管仅仅有短短不到200行代码。可是,里面的有些基本函数。我还是得简单的说明

1.  Color.argb(60, 255, 255, 255);   这个是来得到一个颜色。而且设置他的透明度。第一个參数就是透明度,0~255之间,其它的RGB,呵呵。不解释,自己搞。

2. 以下的两个方法,是画笔的方法。非常重要

mPaint.setStyle(Style.STROKE); //这个是原来显示空心的东西

mPaint.setStrokeWidth(mProgressWidth);   //这个是空心最外层的宽度

比方:drawArc 是画一个圆,那么,我们的设置了以上两个方法,就是要画一个空心圆,圆的轨迹宽度就是  mProgressWidth

3.画圆的时候,開始度数和结束度数一定要控制好哦。

4.假设您还有什么不懂的,请多了解:Canvas 和Paint的相关方法和API,在此不胜感激。





写这篇博客的目的为了分享,我也希望能给你们提供一些思路,希望大家把不错的控件都共享出来,不胜感激。



好了。博客贴出去,肯定有非常多人要Demo,为了防止蜘蛛乱抓取而丢失下载地址。地址请看代码上的注明点。

转载请注明作者来源:Spring
sky
.

Android 自己定义圆圈进度并显示百分比例控件(纯代码实现)的更多相关文章

  1. Android调用相机拍摄照片并显示到 ImageView控件中

    在前面的一篇文章中曾介绍过简单的开启相机照相功能,详见 Android简单调用相机Camera功能,实现打开照相功能 ,这一次就会将前面拍摄的照片显示到ImageView中,形成一个完整的效果 看实例 ...

  2. [Android] 拍照、截图、保存并显示在ImageView控件中

    近期在做Android的项目,当中部分涉及到图像处理的内容.这里先讲述怎样调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法.     PS:作者购买 ...

  3. Pro Android 4 第六章 构建用户界面以及使用控件(一)

         目前为止,我们已经介绍了android的基础内容,但是还没开始接触用户界面(UI).本章我们将开始探讨用户界面和控件.我们先讨论一下android中UI设计的一般原理,然后我们在介绍一下an ...

  4. android开发游记:meterial design 5.0 开源控件整套合集 及使用demo

    android 的5.0公布不光google官方给出了一些新控件,同一时候还给出了一套符合material design风格的设计标准,这套标准将未来将覆盖google全部产品包括pc端,站点,移动端 ...

  5. 我写的一个 Qt 显示图片的控件

    Qt 中没有专门显示图片的控件.通常我们会使用QLabel来显示图片.可是QLabel 显示图片的能力还是有点弱.比方不支持图像的缩放一类的功能.使用起来不是非常方便. 因此我就自己写了个简单的类. ...

  6. 微信小程序实现显示和隐藏控件-头像-取值-bindblur事件

    微信小程序实现显示和隐藏控件 .wxml: <view class=" {{showOrHidden?'show':'hidden'}}"></view> ...

  7. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...

  8. Ext.net Calendar 控件在有模板页的时候,模板页定义了TD的样式造成日历控件的样式丢掉

    Ext.net Calendar 控件在有模板页的时候,模板页定义了TD的样式造成日历控件的样式丢掉 解决方案 在本页面添加下面的样式 <style type="text/css&qu ...

  9. 一个 Qt 显示图片的控件(继承QWidget,使用QPixmap记录图像,最后在paintEvent进行绘制,可缩放)

    Qt 中没有专门显示图片的控件,通常我们会使用QLabel来显示图片.但是QLabel 显示图片的能力还是有点弱.比如不支持图像的缩放一类的功能,使用起来不是很方便.因此我就自己写了个简单的类. 我这 ...

随机推荐

  1. Oracl常用e函数整理

    最近学Oracle数据库,常常遇到Oracle数据库函数问题,经过默默地琢磨处理,总结了一些Oracle数据库常用函数. ------------------------------------ -- ...

  2. 校内测之zay与银临 (day2)(只有T1)

    一些与题目无关的碎碎念 推出式子来一定要化简!!!freopen不要写错!!!特判不要瞎搞!!!! 做到以上三点能高35分qwq T1 江城唱晚 你看数据那么大,显然又是一道数学题. 这里有n个种海棠 ...

  3. idea使用maven install命令打包(springboot),jar运行时出现没有主清单属性

    原因是:我的项目里除了springboot启动类还自定义了多个main来搞了点小demo,就因为这个原因我花了近一天的时间才找清楚原因. 解决方案:找到多余的main方法,注释或删除掉. (下面可以忽 ...

  4. UVA - 247 Calling Circles(Floyd求传递闭包)

    题目: 思路: 利用Floyd求传递闭包(mp[i][j] = mp[i][j]||(mp[i][k]&&mp[k][j]);),当mp[i][j]=1&&mp[j][ ...

  5. 阿里云ECS屏蔽25端口,官方建议使用465 SSL端口发送邮件

    阿里云ECS  VPC网络,搭建了zabbix,想通过三方邮件系统发送邮件,本机开虚拟机测试发邮件一切正常,到阿里ECS的时候邮件各种发不出去,到处找原因,最后度娘告诉了我真想,原来阿里把25端口屏蔽 ...

  6. JS中遍历EL表达式中后台传过来的Java集合

    前言:在我的项目里有这么一个情况,后台直接model.addAttribute()存储了一个对象,此对象内部有一个集合,前端JSP处理的方法正常情况下就是直接使用EL表达式即可.但是如果在JS中需要使 ...

  7. 使用yolo3模型训练自己的数据集

    使用yolo3模型训练自己的数据集 本项目地址:https://github.com/Cw-zero/Retrain-yolo3 一.运行环境 1. Ubuntu16.04. 2. TensorFlo ...

  8. 57.fielddata预加载机制以及序号标记预加载

    如果真的要对分词的field执行聚合,那么每次都在query-time的同时由es生成fielddata并加载到内存中来,速度可能会比较慢,性能很差,改善性能的方式就是预先生成fielddata值并加 ...

  9. react-router v4 学习实践

    最近学习了 react-router v4,根据官方 API 文档和网上资源做了一个简单的路由示例. 先用官方的工具 create-react-app  初始化一个 react 项目模板,再根据自己的 ...

  10. 08.C语言:特殊函数

    C语言:特殊函数 1.递归函数: 与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段: 当不满足回归条件,不再递推: #include <stdi ...