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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。