Android圆环形自定义进度条控件的绘制
2015-06-12 14:52
302 查看
<span style="font-size:24px;">效果图如下:</span>
以下是代码详细:
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 stub holder = this.getHolder(); holder.addCallback(this); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub ispause = false; } @SuppressLint("WrongCall") @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub init(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub onDraw(); } }).start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub ispause = 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; else radius = 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 block e.printStackTrace(); } longtime --; //工作时间递减 } }else{ Canvas canvas = null; startDraw(canvas , holder); } } } }
相关文章推荐
- AndroidStudio 文档自动提示&代码提示补全
- Android应用性能优化之使用SparseArray替代HashMap
- Android触摸屏事件派发机制详解与源码分析三(Activity篇)
- Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键
- android 页面跳转总结
- Android--全局获取Context的技巧
- Android组建2:动态加载View(对比IOS)
- Android应用开发相关下载资源(2015)
- 基于XMPP协议的Android即时通信系
- adb logcat命令查看并过滤android输出log
- Android NDK开发环境配置
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
- AndroidStudio关联自己下载的android source方法
- android之socket编程实例
- 关于android 不同版本获取wifi SSID,真的没话说了
- android如何改变应用程序安装后显示的图标
- 【转】Android 常用 adb 命令总结
- android developer官网不能打开怎么办
- Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)
- Android高德地图开发详解