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