自定义动态圆形ProgressBar_(二)
2017-01-04 23:12
309 查看
项目下载地址:http://download.csdn.net/detail/fkgjdkblxckvbxbgb/9729162
上一篇文章的大概思想我已经说了,这一篇主要是展示细节工作,自定义属性,测量尺寸,以及一些异常情况的处理
如果有兴趣了解绘图方式,可以去看文件一,源代码下面可以提供下载
====================================================
自定义属性
布局文件=======================================
=================================================
Activity中的引用
1:在主线程中去绘制
2:开线程绘制
个人觉得两个没什么多大的区别,
===============主线程绘制====================================
packagecom.cdl.demo;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Cap;
importandroid.graphics.Rect;
importandroid.graphics.RectF;
importandroid.util.AttributeSet;
importandroid.view.View;
publicclassMyViewextendsView{
PaintmPaint;
/**画笔的宽度*/
intPROGRESS_WIDTH;
/**半径*/
intcircleRadius;
/**文字的描述*/
StringtextDesc;
/**文字的大小尺寸*/
intTEXT_SIXE;
intTEXT_COLOR;
intprogress=0;
privateintPROGRESS_BG;
privateintPROGRESS_COLOR;
booleanrunning=true;
/**开启线程绘制View*/
//MyThreadmyThread;
/**画弧度递增的变量*/
privateintsweepAngle=0;
publicMyView(Contextcontext){
this(context,null);
}
publicMyView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicMyView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
TypedArrayta=getContext().obtainStyledAttributes(attrs,R.styleable.MyView);
PROGRESS_BG=ta.getColor(R.styleable.MyView_viewbg,0xffffffff);
PROGRESS_COLOR=ta.getColor(R.styleable.MyView_progresscolor,0xff7fc6f8);
TEXT_COLOR=ta.getColor(R.styleable.MyView_textcolor,0xff9A32CD);
TEXT_SIXE=ta.getDimensionPixelOffset(R.styleable.MyView_textsize,30);
PROGRESS_WIDTH=ta.getDimensionPixelOffset(R.styleable.MyView_progresswidth,30);
ta.recycle();
initView();
}
privatevoidinitView(){
mPaint=newPaint();
mPaint.setAntiAlias(true);
//mPaint.setDither(true);//设置抖动,颜色过渡更均匀
mPaint.setStrokeCap(Cap.ROUND);
}
publicintdefaultWidth=300;
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
intwidthSpecModel=MeasureSpec.getMode(widthMeasureSpec);
intwidthSpecSize=MeasureSpec.getSize(widthMeasureSpec);
intheightSpecModel=MeasureSpec.getMode(heightMeasureSpec);
intheightSpcSzie=MeasureSpec.getSize(heightMeasureSpec);
if(widthSpecModel==MeasureSpec.AT_MOST&heightSpecModel==MeasureSpec.AT_MOST){
widthSpecSize=defaultWidth;
heightSpcSzie=defaultWidth;
circleRadius=defaultWidth;
}elseif(widthSpecModel==MeasureSpec.AT_MOST){
widthSpecSize=defaultWidth;
circleRadius=defaultWidth;
}elseif(heightSpecModel==MeasureSpec.AT_MOST){
heightSpcSzie=defaultWidth;
circleRadius=defaultWidth;
}
circleRadius=widthSpecSize;
setMeasuredDimension(widthSpecSize,heightSpcSzie);
}
publicvoidsetProgress(intprogress){
this.progress=progress;
if(running){
System.out.println("====打断");
running=false;
}
running=true;
invalidate();
}
protectedvoidonDraw(finalCanvascanvas){
super.onDraw(canvas);
/**绘制背景*/
drawbg(canvas);
drawText(canvas);
drawProgress(canvas);
if(sweepAngle!=progress){
sweepAngle++;
invalidate();
}
}
privatevoiddrawProgress(finalCanvascanvas){
intwidth=getWidth();
intheight=getHeight();
mPaint.setColor(PROGRESS_COLOR);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(PROGRESS_WIDTH);
intleft=width/2-circleRadius/2+PROGRESS_WIDTH/2;
inttop=height/2-circleRadius/2+PROGRESS_WIDTH/2;
intright=width/2+circleRadius/2-PROGRESS_WIDTH/2;
intbottom=height/2+circleRadius/2-PROGRESS_WIDTH/2;
RectFoval1=newRectF(left,top,right,bottom);
intarc=sweepAngle*360/100;
canvas.drawArc(oval1,0,arc,false,mPaint);//小弧形
}
privatevoiddrawText(finalCanvascanvas){
textDesc=sweepAngle+"%";
finalintwidth=getWidth();
finalintheight=getHeight();
finalRectbounds=newRect();
mPaint.setColor(TEXT_COLOR);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setTextSize(TEXT_SIXE);
mPaint.getTextBounds(textDesc,0,textDesc.length(),bounds);
canvas.drawText(textDesc,(width/2)-(bounds.width()/2),(height/2)+(bounds.height()/2),mPaint);
}
privatevoiddrawbg(Canvascanvas){
intwidth=getWidth();
intheight=getHeight();
mPaint.setColor(PROGRESS_BG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeWidth(PROGRESS_WIDTH);
canvas.drawCircle(width/2,height/2,circleRadius/2-PROGRESS_WIDTH/2,mPaint);
}
}
=====================开线程============================
上一篇文章的大概思想我已经说了,这一篇主要是展示细节工作,自定义属性,测量尺寸,以及一些异常情况的处理
如果有兴趣了解绘图方式,可以去看文件一,源代码下面可以提供下载
====================================================
自定义属性
<?xmlversion="1.0"encoding="utf-8"?> <resources> <declare-styleablename="MyView"> <attrname="viewbg"format="color"/> <attrname="progresscolor"format="color"/> <attrname="progresswidth"format="dimension"/> <attrname="textsize"format="dimension"/> <attrname="textcolor"format="color"/> </declare-styleable> </resources>
布局文件=======================================
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.cdl.demo.MyView android:id="@+id/myview" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" app:progresscolor="#BA55D3" app:progresswidth="20dp" app:textcolor="#ffffff" app:textsize="20dp" app:viewbg="#B0C4DE"/> </RelativeLayout>
=================================================
Activity中的引用
packagecom.cdl.demo; importandroid.app.Activity; importandroid.os.Bundle; publicclassMainActivityextendsActivity{ MyViewmyview; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myview=(MyView)findViewById(R.id.myview); myview.setProgress(80); // } }==================提供两种方法来绘图=================================
1:在主线程中去绘制
2:开线程绘制
个人觉得两个没什么多大的区别,
===============主线程绘制====================================
packagecom.cdl.demo;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Cap;
importandroid.graphics.Rect;
importandroid.graphics.RectF;
importandroid.util.AttributeSet;
importandroid.view.View;
publicclassMyViewextendsView{
PaintmPaint;
/**画笔的宽度*/
intPROGRESS_WIDTH;
/**半径*/
intcircleRadius;
/**文字的描述*/
StringtextDesc;
/**文字的大小尺寸*/
intTEXT_SIXE;
intTEXT_COLOR;
intprogress=0;
privateintPROGRESS_BG;
privateintPROGRESS_COLOR;
booleanrunning=true;
/**开启线程绘制View*/
//MyThreadmyThread;
/**画弧度递增的变量*/
privateintsweepAngle=0;
publicMyView(Contextcontext){
this(context,null);
}
publicMyView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicMyView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
TypedArrayta=getContext().obtainStyledAttributes(attrs,R.styleable.MyView);
PROGRESS_BG=ta.getColor(R.styleable.MyView_viewbg,0xffffffff);
PROGRESS_COLOR=ta.getColor(R.styleable.MyView_progresscolor,0xff7fc6f8);
TEXT_COLOR=ta.getColor(R.styleable.MyView_textcolor,0xff9A32CD);
TEXT_SIXE=ta.getDimensionPixelOffset(R.styleable.MyView_textsize,30);
PROGRESS_WIDTH=ta.getDimensionPixelOffset(R.styleable.MyView_progresswidth,30);
ta.recycle();
initView();
}
privatevoidinitView(){
mPaint=newPaint();
mPaint.setAntiAlias(true);
//mPaint.setDither(true);//设置抖动,颜色过渡更均匀
mPaint.setStrokeCap(Cap.ROUND);
}
publicintdefaultWidth=300;
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
intwidthSpecModel=MeasureSpec.getMode(widthMeasureSpec);
intwidthSpecSize=MeasureSpec.getSize(widthMeasureSpec);
intheightSpecModel=MeasureSpec.getMode(heightMeasureSpec);
intheightSpcSzie=MeasureSpec.getSize(heightMeasureSpec);
if(widthSpecModel==MeasureSpec.AT_MOST&heightSpecModel==MeasureSpec.AT_MOST){
widthSpecSize=defaultWidth;
heightSpcSzie=defaultWidth;
circleRadius=defaultWidth;
}elseif(widthSpecModel==MeasureSpec.AT_MOST){
widthSpecSize=defaultWidth;
circleRadius=defaultWidth;
}elseif(heightSpecModel==MeasureSpec.AT_MOST){
heightSpcSzie=defaultWidth;
circleRadius=defaultWidth;
}
circleRadius=widthSpecSize;
setMeasuredDimension(widthSpecSize,heightSpcSzie);
}
publicvoidsetProgress(intprogress){
this.progress=progress;
if(running){
System.out.println("====打断");
running=false;
}
running=true;
invalidate();
}
protectedvoidonDraw(finalCanvascanvas){
super.onDraw(canvas);
/**绘制背景*/
drawbg(canvas);
drawText(canvas);
drawProgress(canvas);
if(sweepAngle!=progress){
sweepAngle++;
invalidate();
}
}
privatevoiddrawProgress(finalCanvascanvas){
intwidth=getWidth();
intheight=getHeight();
mPaint.setColor(PROGRESS_COLOR);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(PROGRESS_WIDTH);
intleft=width/2-circleRadius/2+PROGRESS_WIDTH/2;
inttop=height/2-circleRadius/2+PROGRESS_WIDTH/2;
intright=width/2+circleRadius/2-PROGRESS_WIDTH/2;
intbottom=height/2+circleRadius/2-PROGRESS_WIDTH/2;
RectFoval1=newRectF(left,top,right,bottom);
intarc=sweepAngle*360/100;
canvas.drawArc(oval1,0,arc,false,mPaint);//小弧形
}
privatevoiddrawText(finalCanvascanvas){
textDesc=sweepAngle+"%";
finalintwidth=getWidth();
finalintheight=getHeight();
finalRectbounds=newRect();
mPaint.setColor(TEXT_COLOR);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setTextSize(TEXT_SIXE);
mPaint.getTextBounds(textDesc,0,textDesc.length(),bounds);
canvas.drawText(textDesc,(width/2)-(bounds.width()/2),(height/2)+(bounds.height()/2),mPaint);
}
privatevoiddrawbg(Canvascanvas){
intwidth=getWidth();
intheight=getHeight();
mPaint.setColor(PROGRESS_BG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeWidth(PROGRESS_WIDTH);
canvas.drawCircle(width/2,height/2,circleRadius/2-PROGRESS_WIDTH/2,mPaint);
}
}
=====================开线程============================
packagecom.example.videodemo;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Cap;
importandroid.graphics.Rect;
importandroid.graphics.RectF;
importandroid.util.AttributeSet;
importandroid.view.View;
publicclassMyViewextendsView{
PaintmPaint;
/**画笔的宽度*/
intPROGRESS_WIDTH;
/**半径*/
intcircleRadius;
/**文字的描述*/
StringtextDesc;
/**文字的大小尺寸*/
intTEXT_SIXE;
/**文字的颜色*/
intTEXT_COLOR;
/**进度*/
intprogress=0;
/**控件的背景色*/
privateintPROGRESS_BG;
/**进度的颜色*/
privateintPROGRESS_COLOR;
booleanrunning=true;
/**开启线程绘制View*/
MyThreadmyThread;
/**画弧度递增的变量*/
privateintsweepAngle;
publicMyView(Contextcontext){
this(context,null);
}
publicMyView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicMyView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
//获取自定义的属性
TypedArrayta=getContext().obtainStyledAttributes(attrs,R.styleable.MyView);
PROGRESS_BG=ta.getColor(R.styleable.MyView_viewbg,0xffffffff);
PROGRESS_COLOR=ta.getColor(R.styleable.MyView_progresscolor,0xff7fc6f8);
TEXT_COLOR=ta.getColor(R.styleable.MyView_textcolor,0xff9A32CD);
TEXT_SIXE=ta.getDimensionPixelOffset(R.styleable.MyView_textsize,30);
PROGRESS_WIDTH=ta.getDimensionPixelOffset(R.styleable.MyView_progresswidth,30);
ta.recycle();
initView();
}
privatevoidinitView(){
mPaint=newPaint();
mPaint.setAntiAlias(true);
//mPaint.setDither(true);//设置抖动,颜色过渡更均匀
mPaint.setStrokeCap(Cap.ROUND);
}
/**如果用户设置wap_content,默认尺寸为300*/
publicintdefaultWidth=300;
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
intwidthSpecModel=MeasureSpec.getMode(widthMeasureSpec);
intwidthSpecSize=MeasureSpec.getSize(widthMeasureSpec);
intheightSpecModel=MeasureSpec.getMode(heightMeasureSpec);
intheightSpcSzie=MeasureSpec.getSize(heightMeasureSpec);
if(widthSpecModel==MeasureSpec.AT_MOST&heightSpecModel==MeasureSpec.AT_MOST){
widthSpecSize=defaultWidth;
heightSpcSzie=defaultWidth;
circleRadius=defaultWidth;
}elseif(widthSpecModel==MeasureSpec.AT_MOST){
widthSpecSize=defaultWidth;
circleRadius=defaultWidth;
}elseif(heightSpecModel==MeasureSpec.AT_MOST){
heightSpcSzie=defaultWidth;
circleRadius=defaultWidth;
}
circleRadius=widthSpecSize;
setMeasuredDimension(widthSpecSize,heightSpcSzie);
}
publicvoidsetProgress(intprogress){
this.progress=progress;
//用户频繁设置进度,防止界面异常,直接停止刷新,每次重新绘制
if(running){
running=false;
}
running=true;
invalidate();
}
protectedvoidonDraw(finalCanvascanvas){
super.onDraw(canvas);
/**绘制背景.背景只用绘制一次*/
drawbg(canvas);
if(myThread==null){
myThread=newMyThread();
myThread.start();
}else{
drawText(canvas);
drawProgress(canvas);
}
}
//开启一个子线程绘制ui
privateclassMyThreadextendsThread{
@Override
publicvoidrun(){
while(running){
logic();
postInvalidate();
try{
Thread.sleep(10);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
protectedvoidlogic(){
sweepAngle+=1;
mPaint.setColor(Color.RED);
if(sweepAngle==progress){
running=false;
}
}
privatevoiddrawProgress(finalCanvascanvas){
/**画笔旋转的角度*/
intwidth=getWidth();
intheight=getHeight();
mPaint.setColor(PROGRESS_COLOR);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(PROGRESS_WIDTH);
intleft=width/2-circleRadius/2+PROGRESS_WIDTH/2;
inttop=height/2-circleRadius/2+PROGRESS_WIDTH/2;
intright=width/2+circleRadius/2-PROGRESS_WIDTH/2;
intbottom=height/2+circleRadius/2-PROGRESS_WIDTH/2;
RectFoval1=newRectF(left,top,right,bottom);
intarc=sweepAngle*360/100;
canvas.drawArc(oval1,0,arc,false,mPaint);//小弧形
}
privatevoiddrawText(finalCanvascanvas){
textDesc=sweepAngle+"%";
finalintwidth=getWidth();
finalintheight=getHeight();
finalRectbounds=newRect();
mPaint.setColor(TEXT_COLOR);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setTextSize(TEXT_SIXE);
mPaint.getTextBounds(textDesc,0,textDesc.length(),bounds);
canvas.drawText(textDesc,(width/2)-(bounds.width()/2),(height/2)+(bounds.height()/2),mPaint);
}
privatevoiddrawbg(Canvascanvas){
intwidth=getWidth();
intheight=getHeight();
mPaint.setColor(PROGRESS_BG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setStrokeWidth(PROGRESS_WIDTH);
canv
b20b
as.drawCircle(width/2,height/2,circleRadius/2-PROGRESS_WIDTH/2,mPaint);
}
}
相关文章推荐
- 自定义动态圆形ProgressBar_(一)
- android开发 自定义圆形Progressbar
- Android 自定义的圆形变化ProgressBar
- 自定义圆形ProgressBar背景的三种方法
- Android ProgressBar高级自定义水平/圆形进度条
- 【Android进度条】三种方式实现自定义圆形进度条ProgressBar
- Android简单自定义圆形和水平ProgressBar
- Android progressBar 自定义圆形旋转图片
- 自定义圆形、半圆形ProgressBar
- (4.1.15.1) Android简单自定义圆形和水平ProgressBar
- 自定义圆形的ProgressBar
- 自定义圆形进度条 progressBar
- Android 三种方式实现自定义圆形进度条ProgressBar
- Android progressBar 自定义圆形旋转图片
- Android简单自定义圆形和水平ProgressBar
- 自定义带动画效果的圆形ProgressBar
- 自定义ProgressBar(圆形)
- 自定义圆形的ProgressBar
- Android简单自定义圆形和水平ProgressBar
- 【Android进度条】三种方式实现自定义圆形进度条ProgressBar