簡單的鐘表自定義控件
效果圖:
代碼如下:`/**
-
Created by LCT
-
Time:2019/6/11 10:36.
-
Annotation:
/
public class MyClockView extends View {
Context context;
float strokeWidth = 26;
/*- 時針寬度
/
float hourHandsStrokeWidth = strokeWidth / 3;
/* - 分針寬度
/
float minuteHandStrokeWidth = hourHandsStrokeWidth / 2;
/* - 時針長度
/
float hourHandsL = strokeWidth * 5;
/* - 分針長度
/
float minuteHandL = strokeWidth * 4;
int width;
int height;
/* - 圓環色
/
String c1 = “#2b374a”;
/* - 粉紅弧線
/
String c2 = “#a34c33”;
String c22 = “#d27953”;
/* - 藍色弧線
/
String c3 = “#3F51B5”;
/* - 指針
/
String c4 = “#9a9a98”;
Paint paintC = new Paint();
/* - 還未開始畫筆
/
Paint paintA = new Paint();
Paint paintB = new Paint();
Paint paintD = new Paint();
/* - 時針畫筆
/
Paint timeNeedlePaint = new Paint();
/* - 分針畫筆
*/
Paint minuteNeedlePaint = new Paint();
float mCircle;
int mCx;
int mCy;
private RectF oval;
int startX=180;
public MyClockView(Context context) {
super(context);
initView(context);
}
public MyClockView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
}public MyClockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setCircle();
}@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);}
private void setCircle() {
width = getMeasuredWidth();
height = getMeasuredHeight();
mCircle = width / 2 - 40;
mCx = width / 2;
mCy = mCx;float xW = width - 40; float yH = xW; oval = new RectF(40, 40, xW, yH);
}
private void initView(Context context) {
this.context = context;
paintC.setColor(Color.parseColor(c1));
paintC.setStyle(Paint.Style.STROKE);
paintC.setStrokeWidth(strokeWidth);
setPaintStyle(paintC);paintA.setColor(Color.parseColor(c2)); paintA.setStyle(Paint.Style.STROKE); paintA.setStrokeWidth(strokeWidth - 8); setPaintStyle(paintA); paintB.setColor(Color.parseColor(c3)); paintB.setStyle(Paint.Style.STROKE); paintB.setStrokeWidth(strokeWidth); setPaintStyle(paintB); paintD.setColor(Color.parseColor(c22)); paintD.setStyle(Paint.Style.STROKE); paintD.setStrokeWidth(strokeWidth + 12); setPaintStyle(paintD); timeNeedlePaint.setColor(Color.RED); timeNeedlePaint.setStyle(Paint.Style.FILL); timeNeedlePaint.setStrokeWidth(hourHandsStrokeWidth); setPaintStyle(timeNeedlePaint); minuteNeedlePaint.setColor(Color.RED); minuteNeedlePaint.setStyle(Paint.Style.FILL); minuteNeedlePaint.setStrokeWidth(minuteHandStrokeWidth); setPaintStyle(minuteNeedlePaint);
}
private void setPaintStyle(Paint paint) {
paint.setAntiAlias(true);//設置抗鋸齒
paint.setStrokeCap(Paint.Cap.ROUND);
}@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**
* 繪製空心圓
/
canvas.drawCircle(mCx, mCy, mCircle, paintC);
/*
* 繪製圓弧 未開始
/
canvas.drawArc(oval, -70, 50, false, paintA);
/*
* 過去
/
canvas.drawArc(oval, 90, 60, false, paintB);
/*
* 已開始
/
canvas.drawArc(oval, startX, 60, false, paintD);
/*
* 繪製指針
*/
drawScale(canvas);
handler.sendEmptyMessageDelayed(1,100);
}private void drawScale(Canvas canvas) {
/**
* 繪製刻度
*/
for (int i = 0; i < 24; ++i) {
//設置大刻度
if (i % 2 == 0) {
canvas.drawLine(width / 2, 40 + strokeWidth, width / 2, hourHandsL, timeNeedlePaint);
} else { //設置小刻度
canvas.drawLine(width / 2, 40 + strokeWidth, width / 2, minuteHandL, minuteNeedlePaint);
}
canvas.rotate(15, width / 2, width / 2);
}}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==1) {
if (startX>=360) {
startX=0;
}
startX+=10;
invalidate();
}
}
};
}`
就這麼多了,簡單記錄 - 時針寬度