Android自定义圆形ProgressBar
闲来无事做了一个自定义的进度条,大致效果图如下:
废话不多说,下面直接上代码:
自定义控件代码CircleProgressBar.java:
public class CircleProgressBar extends View{
// 画圆环的画笔
private Paint ringPaint;
// 画字体的画笔
private Paint textPaint;
// 圆环颜色
private int ringColor;
// 字体颜色
private int textColor;
// 半径
private float radius;
// 圆环宽度
private float strokeWidth;
// 字的长度
private float txtWidth;
// 字的高度
private float txtHeight;
// 总进度
private int totalProgress = 100;
// 当前进度
private int currentProgress;
// 透明度 private int alpha = 25;
public CircleProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
initAttrs(context, attrs);
initVariable();
}
private void initAttrs(Context context, AttributeSet attrs) {
TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CircleProgressbar, 0 , 0);
radius = typeArray.getDimension(R.styleable.CircleProgressbar_radius, 80);
strokeWidth = typeArray.getDimension(R.styleable.CircleProgressbar_strokeWidth, 10);
ringColor = typeArray.getColor(R.styleable.CircleProgressbar_ringColor, 0xFF0000);
textColor = typeArray.getColor(R.styleable.CircleProgressbar_textColor, 0xFFFFFF);
}
private void initVariable() {
ringPaint = new Paint();
ringPaint.setAntiAlias(true);
ringPaint.setDither(true);
ringPaint.setColor(ringColor);
ringPaint.setStyle(Paint.Style.STROKE);
ringPaint.setStrokeCap(Cap.ROUND);
ringPaint.setStrokeWidth(strokeWidth);
textPaint = new Paint();
textPaint.setAntiAlias(true);
textPaint.setStyle(Paint.Style.FILL);
textPaint.setColor(textColor);
textPaint.setTextSize(radius/2);
FontMetrics fm = textPaint.getFontMetrics();
txtHeight = fm.descent + Math.abs(fm.ascent);
}
@Override
protected void onDraw(Canvas canvas) {
if (currentProgress >= 0) {
ringPaint.setAlpha((int) (alpha + ((float) currentProgress / totalProgress)*230));
RectF oval = new RectF(getWidth() / 2 - radius, getHeight() / 2 - radius, getWidth() / 2 + radius, getHeight() / 2 + radius);
canvas.drawArc(oval, 0, 0, false, ringPaint);
canvas.drawArc(oval, -90, ((float) currentProgress / totalProgress) * 360, false, ringPaint);
String txt = currentProgress + "%";
txtWidth = textPaint.measureText(txt, 0, txt.length());
canvas.drawText(txt, getWidth() / 2 - txtWidth / 2, getHeight() / 2 + txtHeight / 4, textPaint);
}
}
public void setProgress(int progress) {
currentProgress = progress;
postInvalidate();
}
}
自定义控件的属性文件attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CircleProgressbar">
<attr name="radius" format="dimension"/>
<attr name="strokeWidth" format="dimension"/>
<attr name="ringColor" format="color"/>
<attr name="textColor" format="color"/>
</declare-styleable>
</resources>
下面是主界面的布局文件和具体实现:
布局activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cp="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<me.my.circleprogressbar.CircleProgressBar
android:id="@+id/circleProgressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
cp:radius="80dp"
cp:strokeWidth="10dp"
cp:ringColor="#ff0000"
cp:textColor="#0000ff"/>
</RelativeLayout>
实现MainActivity.java:
public class MainActivity extends Activity {
private CircleProgressBar circleProgressBar;
private int totalProgress = 100;
private int currentProgress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
circleProgressBar = (CircleProgressBar) findViewById(R.id.circleProgressbar);
new Thread(new ProgressRunable()).start();
}
class ProgressRunable implements Runnable {
@Override
public void run() {
while (currentProgress < totalProgress) {
currentProgress += 1;
circleProgressBar.setProgress(currentProgress);
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
其实实现非常简单,就是通过进度画圆环,具体的我也就不多说了,代码中有不足之处希望大家批评指正,共同学习!
Android自定义圆形ProgressBar的更多相关文章
- 带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变
带你体验Android自定义圆形刻度罗盘 仪表盘 实现指针动态改变 转 https://blog.csdn.net/qq_30993595/article/details/78915115 近期有 ...
- Android 自定义圆形图片 CircleImageView
1.效果预览 1.1.布局中写自定义圆形图片的路径即可 1.2.然后看一看图片效果 1.3.原图是这样的 @mipmap/ic_launcher 2.使用过程 2.1.CircleImageView源 ...
- android 自定义圆形进度条
一.通过动画实现 定义res/anim/loading.xml如下: [html] view plain copy print ? <?xml version="1.0" ...
- Android 自定义圆形旋转进度条,仿微博头像加载效果
微博 App 的用户头像有一个圆形旋转进度条的加载效果,看上去效果非常不错,如图所示: 据说 Instagram 也采用了这种效果.最近抽空研究了一下,最后实现的效果是这样: 基本上能模拟出个大概,代 ...
- Android自定义圆形图片工具类(CTRL+C加CTRL+V直接使用)
先贴一下工具类的代码!可直接复制粘贴 public class RoundImageView extends ImageView { private Paint mPaint; //画笔 privat ...
- [转]android 自定义圆形imageview控件
android布局 首先,定义定义圆形Imageview类: import android.content.Context; import android.graphics.Bitmap; imp ...
- Android 修改圆形progressBar颜色
查了半天资料,没查到怎样修改progressBar的方法,全都是重新写个ProgressBar,其实很简单在只要一句xml里一句化就可以 android:indeterminateTint=" ...
- android自定义圆形图片和遇到的问题
画圆遇到的问题:图片单位不一样,导致图片只能显示出圆的一部分:看代码: public class MyCircleIamge extends ImageView { private Context c ...
- Android自定义圆形进度条,完成类似LOFTER效果
1.http://stackoverflow.com/questions/3760381/rotating-image-animation-list-or-animated-rotate-androi ...
随机推荐
- SpringBoot-模板渲染
模板 开发Web站点的本质,其实就是根据浏览器发起的请求(输入),生成HTML代码返回给浏览器(输出).在之前的学习中,我们已经通过文件的形式存储起来而不是直接在Java代码中生成HTML代码.另一方 ...
- nodejs 视频教程《一起学nodejs》
一起学nodejs 讲师: matthew vscode+nodejs4.6 http://list.youku.com/albumlist/show/id_27966955.html?spm=a ...
- how to use greendao in android studio
http://www.arjunsk.com/android/use-greendao-android-studio/ 1.新建一个java文件MainGenerator.java: import d ...
- centos6.5安装cmake-gui
首先下载cmake(官网,2.8.12版本) 解压 运行 ./bootstrap --qt-gui make make install 完成后,在/usr/local/bin目录下会出现cmake-g ...
- 关于理财和买房 http://shouce.jb51.net/phpcms/ https://www.bj.cmbchina.com/bjtransweb/wsgzd_employ/login.jsp
对于绝大多数家境普通的年轻人来说,青年阶段无疑是一生中手头最紧的时候.原因很简单,这个阶段花钱最多,挣钱却最少.年轻人收入往往是硬性的低,开支却往往是硬性 的高.已经加班到晕头转向的小职员,很难再 ...
- linux系统压缩\解压命令详解
转自:http://www.cnblogs.com/qq78292959/archive/2011/07/06/2099427.html. tar -c: 建立压缩档案-x:解压-t:查看内容-r:向 ...
- yii2美化url
http://blog.csdn.net/xundh/article/details/45418265
- selenium 模块
介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如 ...
- python全栈开发从入门到放弃之函数进阶
1.三元运算 a= 1 b=2 max = (a if a>b else b ) #条件成立的结果 if 条件 else 条件不成立的结果 print(max) 2.先上一首python之禅 i ...
- listview与adapter用法
Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用 ...