android自定义简单时钟
本文实例为大家分享了android实现简单时钟的具体代码,供大家参考,具体内容如下
attrs定义如下
自定义ClockView代码如下
packagecom.example.helloworld;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroidx.annotation.Nullable;
importjava.util.Calendar;
/**
*时钟
*
*@since2021-02-29
*@authorSar
*/
publicclassClockViewextendsView{
privatestaticfinalintDEFAULT_POINTER_COLOR=Color.parseColor("#FFFFFF");
privatestaticfinalintDEFAULT_SCALE_COLOR=Color.parseColor("#FFFFFF");
privatestaticfinalintDEFAULT_ONE_CIRCLE_COLOR=Color.parseColor("#FFFFFF");
privatestaticfinalintDEFAULT_TWO_CIRCLE_COLOR=Color.parseColor("#CCCCCC");
privatestaticfinalintDEFAULT_THREE_CIRCLE_COLOR=Color.parseColor("#BBBBBB");
privatestaticfinalintDEFAULT_FOUR_CIRCLE_COLOR=Color.parseColor("#AAAAAA");
privatestaticfinalintDEFAULT_FOUR_CIRCLE_DIAMETER=180;//默认外圈圆直径,也就是该控件默认宽高,单位dp
privateintpointerColor;//指针颜色
privateintscaleColor;//刻度颜色
privateintoneCircleColor;//中心圆颜色
privateinttwoCircleColor;//次中心圆颜色
privateintthreeCircleColor;//次外圈圆颜色
privateintfourCircleColor;//外圈圆颜色
privatePaintpaint;
privateintcx;
privateintcy;
privateintscaleStrokeWidth;
privateinthourPointerWidth;
privateintminutePointerWidth;
privateintoneCircleDiameter;
privateinttwoCircleDiameter;
privateintthreeCircleDiameter;
privateintfourCircleDiameter;
privateintdefaultFourCircleDiameter;
publicClockView(Contextcontext){
super(context);
init(context,null,0);
}
publicClockView(Contextcontext,@NullableAttributeSetattrs){
super(context,attrs);
init(context,attrs,0);
}
publicClockView(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
init(context,attrs,defStyleAttr);
}
privatevoidinit(Contextcontext,AttributeSetattrs,intdefStyleAttr){
if(attrs!=null){
TypedArraytypedArray=context.obtainStyledAttributes(attrs,R.styleable.ClockView,defStyleAttr,0);
pointerColor=typedArray.getColor(R.styleable.XTClockView_pointer_color,DEFAULT_POINTER_COLOR);
scaleColor=typedArray.getColor(R.styleable.XTClockView_scale_color,DEFAULT_SCALE_COLOR);
oneCircleColor=typedArray.getColor(R.styleable.XTClockView_one_circle_color,DEFAULT_ONE_CIRCLE_COLOR);
twoCircleColor=typedArray.getColor(R.styleable.XTClockView_two_circle_color,DEFAULT_TWO_CIRCLE_COLOR);
threeCircleColor=typedArray.getColor(R.styleable.XTClockView_three_circle_color,DEFAULT_THREE_CIRCLE_COLOR);
fourCircleColor=typedArray.getColor(R.styleable.XTClockView_four_circle_color,DEFAULT_FOUR_CIRCLE_COLOR);
typedArray.recycle();
}else{
pointerColor=DEFAULT_POINTER_COLOR;
scaleColor=DEFAULT_SCALE_COLOR;
oneCircleColor=DEFAULT_ONE_CIRCLE_COLOR;
twoCircleColor=DEFAULT_TWO_CIRCLE_COLOR;
threeCircleColor=DEFAULT_THREE_CIRCLE_COLOR;
fourCircleColor=DEFAULT_FOUR_CIRCLE_COLOR;
}
paint=newPaint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
defaultFourCircleDiameter=dp2px(context,DEFAULT_FOUR_CIRCLE_DIAMETER);
}
publicvoidsetPointerColor(intpointerColor){
this.pointerColor=pointerColor;
}
publicvoidsetScaleColor(intscaleColor){
this.scaleColor=scaleColor;
}
publicvoidsetOneCircleColor(intoneCircleColor){
this.oneCircleColor=oneCircleColor;
}
publicvoidsetTwoCircleColor(inttwoCircleColor){
this.twoCircleColor=twoCircleColor;
}
publicvoidsetThreeCircleColor(intthreeCircleColor){
this.threeCircleColor=threeCircleColor;
}
publicvoidsetFourCircleColor(intfourCircleColor){
this.fourCircleColor=fourCircleColor;
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
intwidth=0;
intheight=0;
intwidthMode=MeasureSpec.getMode(widthMeasureSpec);
intwidthSize=MeasureSpec.getSize(widthMeasureSpec);
switch(widthMode){
caseMeasureSpec.EXACTLY:
width=widthSize;
break;
caseMeasureSpec.AT_MOST:
caseMeasureSpec.UNSPECIFIED:
width=defaultFourCircleDiameter;
break;
}
intheightMode=MeasureSpec.getMode(heightMeasureSpec);
intheightSize=MeasureSpec.getSize(heightMeasureSpec);
switch(heightMode){
caseMeasureSpec.EXACTLY:
height=heightSize;
break;
caseMeasureSpec.AT_MOST:
caseMeasureSpec.UNSPECIFIED:
height=defaultFourCircleDiameter;
break;
}
setMeasuredDimension(width,height);
cx=width/2;
cy=height/2;
fourCircleDiameter=Math.min(width,height);
threeCircleDiameter=fourCircleDiameter*7/10;
twoCircleDiameter=fourCircleDiameter*28/50;
oneCircleDiameter=fourCircleDiameter*3/50;
scaleStrokeWidth=fourCircleDiameter/100;
hourPointerWidth=oneCircleDiameter*2/5;
minutePointerWidth=oneCircleDiameter/5;
}
privateintdp2px(Contextcontext,intdpValue){
floatscale=context.getResources().getDisplayMetrics().density;
return(int)(dpValue*scale+0.5f);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
drawCircle(canvas,fourCircleColor,fourCircleDiameter);
drawCircle(canvas,threeCircleColor,threeCircleDiameter);
drawCircle(canvas,twoCircleColor,twoCircleDiameter);
drawScale(canvas);
Calendarcalendar=Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
inthour=calendar.get(Calendar.HOUR);
intminute=calendar.get(Calendar.MINUTE);
intsecond=calendar.get(Calendar.SECOND);
paint.setColor(pointerColor);
drawPointer(canvas,(float)(hour*30+minute*0.5),hourPointerWidth,cy-twoCircleDiameter/2*2/3);
drawPointer(canvas,minute*6,minutePointerWidth,cy-twoCircleDiameter/2*4/5);
drawPointer(canvas,second*6,minutePointerWidth,cy-twoCircleDiameter/2*8/9);
paint.setStrokeWidth(0);
drawCircle(canvas,oneCircleColor,oneCircleDiameter);
postInvalidateDelayed(1000);
}
privatevoiddrawCircle(Canvascanvas,intcircleColor,intcircleDiameter){
paint.setColor(circleColor);
canvas.drawCircle(cx,cy,circleDiameter/2,paint);
}
privatevoiddrawScale(Canvascanvas){
paint.setColor(scaleColor);
paint.setStrokeWidth(scaleStrokeWidth);
for(inti=0;i<12;i++){
canvas.save();
canvas.rotate(i*30,cx,cy);
canvas.drawLine(cx,(fourCircleDiameter-threeCircleDiameter)/6,cx,(fourCircleDiameter-threeCircleDiameter)/3,paint);
canvas.restore();
}
}
privatevoiddrawPointer(Canvascanvas,floatrotateDegrees,floatstrokeWidth,floatstopY){
paint.setStrokeWidth(strokeWidth);
canvas.save();
canvas.rotate(rotateDegrees,cx,cy);
canvas.drawLine(cx,cy,cx,stopY,paint);
canvas.restore();
}
}
效果图如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。