Android新手入门实例之Android漂亮时钟的源代码
16lz
2022-04-23
[java] view plain copy print ?
- packagecom.smart.impl;
- importjava.util.Calendar;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.graphics.Canvas;
- importandroid.graphics.Paint;
- importandroid.graphics.Rect;
- importandroid.os.Handler;
- importandroid.util.AttributeSet;
- importandroid.view.View;
- publicclassHandClockextendsViewimplementsRunnable
- {
- privateintclockImageResourceId;
- privateBitmapbitmap;
- privatefloatscale;
- privatefloathandCenterWidthScale;
- privatefloathandCenterHeightScale;
- privateintminuteHandSize;
- privateinthourHandSize;
- privateHandlerhandler=newHandler();
- @Override
- publicvoidrun()
- {
- //重新绘制View
- invalidate();
- //重新设置定时器,在60秒后调用run方法
- handler.postDelayed(this,60*1000);
- }
- @Override
- protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec)
- {
- super.onMeasure(widthMeasureSpec,heightMeasureSpec);
- //根据图像的实际大小等比例设置View的大小
- setMeasuredDimension((int)(bitmap.getWidth()*scale),(int)(bitmap
- .getHeight()*scale));
- }
- @Override
- protectedvoidonDraw(Canvascanvas)
- {
- super.onDraw(canvas);
- Paintpaint=newPaint();
- Rectsrc=newRect();
- Recttarget=newRect();
- src.left=0;
- src.top=0;
- src.right=bitmap.getWidth();
- src.bottom=bitmap.getHeight();
- target.left=0;
- target.top=0;
- target.bottom=(int)(src.bottom*scale);
- target.right=(int)(src.right*scale);
- //画表盘图像
- canvas.drawBitmap(bitmap,src,target,paint);
- //计算表盘中心点的横纵坐标
- floatcenterX=bitmap.getWidth()*scale*handCenterWidthScale;
- floatcenterY=bitmap.getHeight()*scale*handCenterHeightScale;
- //表表盘中心点画一个半径为5的实心圆圈
- canvas.drawCircle(centerX,centerY,5,paint);
- //设置分针为3个象素粗
- paint.setStrokeWidth(3);
- Calendarcalendar=Calendar.getInstance();
- intcurrentMinute=calendar.get(Calendar.MINUTE);
- intcurrentHour=calendar.get(Calendar.HOUR);
- //计算分针和时间的角度
- doubleminuteRadian=Math
- .toRadians((360-((currentMinute*6)-90))%360);
- doublehourRadian=Math.toRadians((360-((currentHour*30)-90))
- %360-(30*currentMinute/60));
- //在表盘上画分针
- canvas.drawLine(centerX,centerY,(int)(centerX+minuteHandSize
- *Math.cos(minuteRadian)),(int)(centerY-minuteHandSize
- *Math.sin(minuteRadian)),paint);
- //设置实针为4个象素粗
- paint.setStrokeWidth(4);
- //在表盘上画分针
- canvas.drawLine(centerX,centerY,(int)(centerX+hourHandSize
- *Math.cos(hourRadian)),(int)(centerY-hourHandSize
- *Math.sin(hourRadian)),paint);
- }
- publicHandClock(Contextcontext,AttributeSetattrs)
- {
- super(context,attrs);
- //读取相应的属性值
- clockImageResourceId=attrs.getAttributeResourceValue(null,
- "clockImageSrc",0);
- if(clockImageResourceId>0)
- bitmap=BitmapFactory.decodeResource(getResources(),
- clockImageResourceId);
- scale=attrs.getAttributeFloatValue(null,"scale",1);
- handCenterWidthScale=attrs.getAttributeFloatValue(null,
- "handCenterWidthScale",bitmap.getWidth()/2);
- handCenterHeightScale=attrs.getAttributeFloatValue(null,
- "handCenterHeightScale",bitmap.getHeight()/2);
- //在读取分针和时针长度后,将其值按图像的缩放比例进行缩放
- minuteHandSize=(int)(attrs.getAttributeIntValue(null,
- "minuteHandSize",0)*scale);
- hourHandSize=(int)(attrs.getAttributeIntValue(null,"hourHandSize",
- 0)*scale);
- intcurrentSecond=Calendar.getInstance().get(Calendar.SECOND);
- //将定时器设在0分时执行run方法
- handler.postDelayed(this,(60-currentSecond)*1000);
- }
- @Override
- protectedvoidonDetachedFromWindow()
- {
- super.onDetachedFromWindow();
- //删除回调类
- handler.removeCallbacks(this);
- }}
更多相关文章
- Android(安卓)全屏无标题详解
- android webview设置自适应任意大小的pc网页
- Android(安卓)去掉title bar的3个方法
- Android中设置全屏的方法
- android之渐变色背景
- Android(安卓)跳转+两种ListView+ListheaderView
- android 横屏 竖屏 全屏 当前屏幕宽 高
- Android中自动跳转到系统设置界面
- TabLayout 设置指示器宽度问题