您的位置:首页 > 移动开发 > Android开发

自定义动态圆形ProgressBar_(二)

2017-01-04 23:12 309 查看
项目下载地址:http://download.csdn.net/detail/fkgjdkblxckvbxbgb/9729162



上一篇文章的大概思想我已经说了,这一篇主要是展示细节工作,自定义属性,测量尺寸,以及一些异常情况的处理

如果有兴趣了解绘图方式,可以去看文件一,源代码下面可以提供下载

====================================================

自定义属性

<?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);
}
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息