自定义VIew——漂亮的圆形进度条
package com.example.firstapp; import java.text.DecimalFormat; import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View; /**
* 自定义圆形进度条思路
*
* 1.先画外圆,再画弧度,
* 2.然后在画内圆
* 3.画文本信息
* 形成一个叠加的效果
*/
public class MyProgressBar extends View {
private FontMetrics fm;
private Paint paint;
/**内圆半径*/
private int inRadius;
/**外圆半径*/
private int outRadius;
/**文字的颜色*/
private int textColor=Color.rgb(20,131,214);
/**内圆的颜色*/
private int inRdColor=Color.WHITE;
/**外圆的颜色*/
private int outRdColor=Color.LTGRAY;
/**进度条的颜色*/
private int proColor=Color.rgb(20,131,214);
/**进度的最大值*/
private int max;
/**当前进度条的值*/
private int progress;
/**文字的大小*/
private int textSize=50; public MyProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} private void init() {
paint = new Paint();
} /***
* 设置内圆的半径
*
* @param radius
*/
public void setInRadius(int radius) {
this.inRadius = radius;
} /***
* 设置外圆的半径
*
* @param radius
*/
public void setOutRadius(int radius) {
this.outRadius = radius;
} /**
* 设置进度条的颜色 默认蓝色
*
* @param color
*/
public void setColor(int color) {
this.textColor=color;
} /***
* 设置文字的颜色值 默认蓝色
*
* @param color
*/
public void setTextColor(int color) {
this.textColor=color;
} /***
* 设置进度条的最大值
* @param max
*/
public void setMax(int max) {
this.max = max;
} /***
* 设置当前进度条的进度值
* @param progress
*/
public void setProgress(int progress) {
this.progress=progress;
//设置进度之后,要求UI强制进行重绘
postInvalidate();
} /**
* 设置文字的大小
* @param size
*/
public void setTextSize(int size){
this.textSize=size;
} @SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取控件的中心点
int cx = getWidth() / 2;
int cy = getHeight() / 2; /***
* 1.画外圆
*/
paint.setAntiAlias(true);// 设置画笔抗锯齿效果
paint.setColor(this.outRdColor);
canvas.drawCircle(cx, cy, this.outRadius, paint); /***
* 2.画弧度
*/
paint.setColor(this.proColor);
// paint.setARGB(0, 25, 63, 155);
// 圆形进度条的宽度就是外圆的半径减去内圆的半径
paint.setStrokeWidth(outRadius - inRadius);
paint.setStyle(Paint.Style.STROKE);//设置弧度外填充 /**
* 用于定义的圆弧的形状和大小的界限, 界限的计算:就是以外圆的正切圆的方式计算出,左上,右下的坐标值
* 有了中心点的坐标值cx,cy,也有了半径r那么
*
* left=cx-外圆的半径
* top=cy-外圆的半径
* right=cx+外圆的半径
* bottom=cy+外圆的半径
*
* 但这里要考虑一个问题是画笔有他本身的宽度,根据上面的思路把画笔的宽度问题,重新计算出圆弧的范围
*/ int middle = (int) (paint.getStrokeWidth() / 2);
RectF oval = new RectF(cx - outRadius + middle, cy - outRadius + middle, cx + outRadius - middle, cy
+ outRadius - middle);
canvas.drawArc(oval, 0, 360 * this.progress / this.max, false, paint); // 根据进度画圆弧 /***
* 3.画内圆
*/
paint.setStyle(Paint.Style.FILL);
paint.setColor(this.inRdColor);
canvas.drawCircle(cx, cy, this.inRadius, paint); /***
*4. 绘制文本
*/
paint.setColor(this.textColor);
paint.setStrokeWidth(5);
paint.setTextSize(this.textSize);
fm = paint.getFontMetrics(); //保留两位小数
DecimalFormat df = new DecimalFormat("#.00");
String numText=df.format(this.progress*1.0/max*100);
// 测量文本的宽度
float textWidth = paint.measureText(numText) / 2;
Log.d("progress", progress+"");
float textCenterVerticalBaselineY = getHeight() / 2 - fm.descent + (fm.descent - fm.ascent) / 2; canvas.drawText(numText, cx - textWidth, textCenterVerticalBaselineY, paint);
} }

自定义VIew——漂亮的圆形进度条的更多相关文章
- Android 自定义漂亮的圆形进度条
公司有这样一个需求,实现这个圆弧进度条 所以,现在就将它抽取出来分享 如果需要是圆帽的就将,下面这句代码放开即可 mRingPaint.setStrokeCap(Paint.Cap.ROUND);// ...
- 自定义View实现钟摆效果进度条PendulumView
转载请注明出处:http://blog.csdn.net/fightlei/article/details/52556755 在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果. ...
- 自定义view的drawRoundRect模拟进度条
主要方法发介绍 1:drawRoundRect参数介绍 drawRoundRect(l,t,r,b,rx,ry,paint)里面的参数可以有两种: 1:前四个参数(l,t,r,,b)分别是矩形左边距离 ...
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
Android 高手进阶(21) 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明地址:http://blog.csdn.net/xiaanming/article/detail ...
- Android 自定义 View 圆形进度条总结
Android 自定义圆形进度条总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 微信公众号:牙锅子 源码:CircleProgress 文中如有纰漏,欢迎大家留言指出. 最近 ...
- 【Android 应用开发】 自定义 圆形进度条 组件
转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...
- android 自定义图片圆形进度条
感觉话一个圆形进度条挺简单的 ,但是却偏偏给了几张图片让你话,说实话我没接触过,感觉好难,还好百度有大把的资源,一番努力下终于画出来了. 代码如下. package com.etong.cpms.wi ...
- Android 带进度的圆形进度条
最近项目有个需求,做带进度从下到上的圆形进度条. 网上查了一下资料,发现这篇博客写得不错http://blog.csdn.net/xiaanming/article/details/10298163 ...
- Android 高手进阶,自己定义圆形进度条
背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...
随机推荐
- Codeforces Round #291 (Div. 2) C - Watto and Mechanism 字符串
[题意]给n个字符串组成的集合,然后有m个询问(0 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) ,每个询问都给出一个字符串s,问集合中是否存在一个字符串t,使得s和t长度相同,并且仅有一个 ...
- 解决JFreeChart中文乱码问题
以下是解决X轴,Y轴中文字符乱码的代码: JFreeChart chart = ChartFactory.createBarChart3D("管网损耗",// 图表标题 " ...
- ie下面兼容性问题的一些总结
最后一次搞ie兼容性问题,以后都可以不管了0.0 1.浮动兼容性 1.1IE6下的双边距BUG 在IE6下,块元素有浮动和横向margin的时候,最边上元素的横向margin值会被放大成两倍 解决办法 ...
- 浏览器中 for in 反射 对象成员 的差异
http://www.cnblogs.com/_franky/archive/2010/05/08/1730437.html 下面是例子 function test(url, obj) { if($( ...
- iOS开发实现登陆
Assumption假设:iOS端加载Web页,然后用户输入用户名密码登陆,WebServer会把用户登陆信息记载在Cookie.那么iOS客户端如何取到Cookie中的登陆信息. 客户端监听 NSH ...
- 小波 mallat 算法
算法要求:输入序列是大于滤波器长度的偶数列 确实可以通过编程的手段使算法适合所有的情况,但本文章的目的是展示mallat算法的过程,所以就一切从简了 // Mallat.cpp : Defines t ...
- 【USACO 1.1.4】破碎的项链
[题目描述] 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的.这里是 n=29 的二个例子: 1 2 ...
- openstack nova数据库计算结点IP地址
最近遇到一个问题就是在控制结点上查找nova数据库中 select * from compute_nodes\G;中出现IP地址一直是127.0.0.1不是计算结点的IP,就算修改成计算结点的IP,也 ...
- python3 解析apk图标
有两处值小点,一是如何解压缩,另一个是如何写文件,第二点上我找的是phthon2的代码,一直写文件的时候报不是字符串的问题,将打开方式加上"b“的模式搞定 print文件出来直接删除了,原因 ...
- php 文件操作之抓取网站图片
$str= file_get_contents("http://v.qq.com/");preg_match_all("/\<img\s+src=.*\s*\> ...