效果图如下:

Android圆环形自定义进度条控件的绘制_第1张图片

以下是代码详细:

package org.example.fanqietime;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.os.Handler;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceView;public class OvalTimeView extends SurfaceView implements SurfaceHolder.Callback {public OvalTimeView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubholder = this.getHolder();holder.addCallback(this);}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {// TODO Auto-generated method stubispause = false;}@SuppressLint("WrongCall")@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubinit();new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubonDraw();}}).start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubispause = true;}private int width;private int height;private int radius,radius2;private int zxX = 0;private int zxY = 0;public SurfaceHolder holder;private boolean ispause = false;private float textSixe1,textSixe2;public void init(){width = getWidth();height = getHeight();if(width >= height)radius = height / 2 - 10;elseradius = width / 2 - 10;zxX = width / 2;zxY = height / 2;radius2 = radius - radius / 20;textSixe1 = (float) (radius * 1.0 / 2.5);textSixe2 = (float) (radius * 1.0 / 6.3);}public float angle = 0;public boolean istop = true;public int sleep = 1000;public int longtime = 0;public int finaltime = 0;public int bgcolor;private Handler thandler;public void setTHandler(Handler thandler){this.thandler = thandler;}public void setLongtime(int finaltime,int currentlong, int color){this.longtime = finaltime - currentlong;this.finaltime = finaltime;bgcolor = color;angle = (float) (angle + (360 * 1.0 / finaltime) * currentlong);istop = false;}public void startDraw(Canvas canvas, SurfaceHolder holder){if(!ispause){canvas = holder.lockCanvas(null);//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。canvas.drawColor(bgcolor);drawWOval(canvas);drawSOval(canvas, angle);drawNOval(canvas);drawNText(canvas);holder.unlockCanvasAndPost(canvas);//结束锁定画图,并提交改变。}}//画外圆public void drawWOval(Canvas canvas){Paint paint = new Paint();paint.setColor(Color.parseColor("#FFFFFF"));paint.setStrokeWidth(2);// 设置画笔粗细paint.setStyle(Paint.Style.FILL);paint.setAntiAlias(true);  canvas.drawOval(new RectF(zxX - radius, zxY - radius, zxX + radius, zxY + radius), paint);}//画内圆public void drawNOval(Canvas canvas){Paint paint = new Paint();paint.setColor(bgcolor);paint.setStrokeWidth(2);// 设置画笔粗细paint.setStyle(Paint.Style.FILL);paint.setAntiAlias(true);  canvas.drawOval(new RectF(zxX - radius2, zxY - radius2, zxX + radius2, zxY + radius2), paint);}//画扇形圆public void drawSOval(Canvas canvas, float angle){Paint paint = new Paint();paint.setColor(bgcolor);paint.setStrokeWidth(2);// 设置画笔粗细paint.setStyle(Paint.Style.FILL);paint.setAlpha(50);paint.setAntiAlias(true);canvas.drawArc(new RectF(zxX - radius, zxY - radius, zxX + radius, zxY + radius), 270, angle, true, paint);}//画外圆public void drawNText(Canvas canvas){Paint paint = new Paint();paint.setColor(Color.parseColor("#FFFFFF"));paint.setStrokeWidth(2);// 设置画笔粗细paint.setStyle(Paint.Style.FILL);paint.setAntiAlias(true);paint.setTextSize(textSixe1);//获取文字宽度高度String str = CommonUtil.SecondsToTimeString(longtime);Rect rect = new Rect();paint.getTextBounds(str, 0, str.length(), rect);int w = rect.width();int h = rect.height();canvas.drawText(str, zxX - (w / 2), zxY + (h / 2), paint);//画工作名称str = AppApplication.getInstances().getWork().getWorkname();paint.setTextSize(textSixe2);paint.getTextBounds(str, 0, str.length(), rect);int ww = rect.width();int hw = rect.height();canvas.drawText(str, zxX - (ww / 2), zxY - hw * 2, paint);}public void onDraw(){while(true){if(!istop){Canvas canvas = null;synchronized (holder){try {startDraw(canvas , holder);angle = (float) (angle + (360 * 1.0 / finaltime));if(angle >= 360 || longtime < 0){thandler.sendEmptyMessage(1001);break;}Thread.sleep(sleep);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}longtime --;//工作时间递减}}else{Canvas canvas = null;startDraw(canvas , holder);}}}}


更多相关文章

  1. android AppCompatEditText 样式(线条粗细等)修改
  2. 超级炫酷!HTML5 Canvas火焰画笔动画
  3. 如何防止滚动体内容,并在打开时允许在非画布导航下滚动?
  4. 如何通过多次单击在画布上显示多个箭头
  5. 在HTML上绘制画布并在屏幕大小上保留Aspect
  6. 动画在画布中移动图像
  7. 检查并删除重复的坐标x,y画布
  8. Canvas(画布)类的使用
  9. Android自定义万能Canvas画布

随机推荐

  1. Android Dialog 去除其中的Title
  2. 4. android 滚动视图
  3. android 获取屏幕的方向
  4. Android DOC文档分析——Dialog
  5. 关于android studio报错transformClasses
  6. Android studio Caused by: org.gradle.a
  7. AndroidManifest.xml配置文件选项详解
  8. 【stagefrightplayer】1 调用过程
  9. ubuntu10.10下的android源码下载及编译
  10. Android与php服务器交互实例