河北
400-650-7353
首页 > IT知识库 > 程序开发 > Android > Android自定义控件之圆形进度条的实现

Android自定义控件之圆形进度条的实现

实现步骤

1、 编写自定义组件MyCircleProgress扩展View

public class MyCircleProgress extends View {

}

2、 在MyCircleProgress类中,定制属性

public int progress = 0;//进度实际值,当前进度

/**

* 自定义控件属性,可灵活的设置圆形进度条的大小、颜色、类型等

*/

private int mR;//圆半径,决定圆大小

private int bgColor;//圆或弧的背景颜色

private int fgColor;//圆或弧的前景颜色,即绘制时的颜色

private int drawStyle; //绘制类型 FILL画圆形进度条,STROKE绘制弧形进度条

private int strokeWidth;//STROKE绘制弧形的弧线的宽度

private int max;//最大值,设置进度的最大值

/**

* 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步

*/

public synchronized void setProgress(int progress) {

if(progress<0){

progress=0;

}else if(progress>max){

progress=max;

}else{

this.progress = progress;

}

}

public int getMax() {

return max; }

3、 为定制的属性编写attrs.xml资源,该资源文件放在res/values目录下,内容如下:

4、 在MyCircleProgress类中定义构造函数,初始化属性

private void initProperty(AttributeSet attrs){

TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar);

mR=tArray.getInteger(R.styleable.CircleProgressBar_r,10);

bgColor=tArray.getColor(R.styleable.CircleProgressBar_bgColor, Color.GRAY);

fgColor=tArray.getColor(R.styleable.CircleProgressBar_fgColor, Color.RED);

drawStyle=tArray.getInt(R.styleable.CircleProgressBar_drawStyle, 0);

strokeWidth=tArray.getInteger(R.styleable.CircleProgressBar_strokeWidth, 10);

max=tArray.getInteger(R.styleable.CircleProgressBar_max, 100);

}

public MyCircleProgress(Context context, AttributeSet attrs) {

super(context, attrs);

this.context = context;

this.paint = new Paint();

this.paint.setAntiAlias(true); // 消除锯齿

this.paint.setStyle(Style.STROKE); // 绘制空心圆或 空心矩形

initProperty(attrs);

}

5、 在MainActivity中布局文件中添加MyCircleProgress组件,如下所示

xmlns:tools="http://schemas.android.com/tools"

xmlns:app="http://schemas.android.com/apk/res/com.jereh.mydrawcircleprogress"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity"

>

android:id="@+id/MyCircleProgress"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

app:r="45"

app:strokeWidth="10"

app:bgColor="#cccccc"

app:fgColor="#ff0000"

app:drawStyle="FILL"

app:max="50"

/>

6、 自定义组件MyCircleProgress中重写onDraw方法:

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

int center = getWidth() / 2; // 圆心位置

this.paint.setColor(bgColor);

this.paint.setStrokeWidth(strokeWidth);

canvas.drawCircle(center, center, mR, this.paint);

// 绘制圆环

this.paint.setColor(fgColor);

if(drawStyle==0){

this.paint.setStyle(Style.STROKE);

opt=false;

}else{

this.paint.setStyle(Style.FILL);

opt=true;

}

int top = (center - mR);

int bottom = (center + mR);

RectF oval = new RectF(top, top, bottom, bottom);

canvas.drawArc(oval, 270, 360*progress/max, opt, paint);

}

7、编写MainActivity

public class MainActivity extends Activity {

private MyCircleProgress progressView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

progressView = (MyCircleProgress) findViewById(R.id.MyCircleProgress);

new ProgressAnimation().execute();

}

class ProgressAnimation extends AsyncTask {

@Override

protected Void doInBackground(Void... params) {

//进度值不断的变化

for (int i = 0; i < progressView.getMax(); i++) {

try {

publishProgress(i);

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

return null;

}

@Override

protected void onProgressUpdate(Integer... values) {

//更新进度值

progressView.setProgress(values[0]);

progressView.invalidate();

super.onProgressUpdate(values);

}

}

}

免责声明:本文来源于网络,由网友提供或网络搜集,仅供个人交流学习参考使用,不涉及商业盈利目的。如有版权问题,请联系本站管理员予以更改或删除。谢谢合作!

热门标签:

推荐阅读

 
 
咨询中心
优就业微信扫一扫
微信扫一扫

400-650-7353

加入官方微博