Android之自定义View以及画一个时钟

概述:

当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用。 建立一个自定义View,需要继承于View类,并且实现其中的至少一个构造函数和两个方法:onMeasure()和onDraw(); onMeasure()用于设置自定义View的尺寸,onDraw()用于绘制View中的内容。

在onDraw()方法中,需要调用画笔绘制图形或文本,绘制的模板时Canvas对象, Canvas类中用来绘制图形文本的方法有:

drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)//画弧,参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始,参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象。

绘制图形需要画笔Paint对象,Paint类中的方法有:

Demo

一个自定义时钟视图的写法:

{private int width;private int height;private Paint mPaintLine;private Paint mPaintCircle;private Paint mPaintHour;private Paint mPaintMinute;private Paint mPaintSec;private Paint mPaintText;private Calendar mCalendar;NEED_INVALIDATE = 0X23;//每隔一秒,在handler中调用一次重新绘制方法private Handler handler = new Handler(){(Message msg) {switch (msg.what){case NEED_INVALIDATE:mCalendar = Calendar.getInstance();invalidate();//告诉UI主线程重新绘制handler.sendEmptyMessageDelayed(NEED_INVALIDATE,1000);break;default:break;}}};public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);mCalendar = Calendar.getInstance();mPaintLine = new Paint();mPaintLine.setColor(Color.BLUE);mPaintLine.setStrokeWidth(10);mPaintCircle = new Paint();mPaintCircle.setColor(Color.GREEN);//设置颜色mPaintCircle.setStrokeWidth(10);//设置线宽mPaintCircle.setAntiAlias(true);//设置是否抗锯齿mPaintCircle.setStyle(Paint.Style.STROKE);//设置绘制风格mPaintText = new Paint();mPaintText.setColor(Color.BLUE);mPaintText.setStrokeWidth(10);mPaintText.setTextAlign(Paint.Align.CENTER);mPaintText.setTextSize(40);mPaintHour = new Paint();mPaintHour.setStrokeWidth(20);mPaintHour.setColor(Color.BLUE);mPaintMinute = new Paint();mPaintMinute.setStrokeWidth(15);mPaintMinute.setColor(Color.BLUE);mPaintSec = new Paint();mPaintSec.setStrokeWidth(10);mPaintSec.setColor(Color.BLUE);handler.sendEmptyMessage(NEED_INVALIDATE);//向handler发送一个消息,让它开启重绘}(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);setMeasuredDimension(width, height);}(Canvas canvas) {super.onDraw(canvas);int circleRadius = 400;//画出大圆canvas.drawCircle(width / 2, height / 2, circleRadius, mPaintCircle);//画出圆中心canvas.drawCircle(width / 2, height / 2, 20, mPaintCircle);//依次旋转画布,,画出每个刻度和对应数字for (int i = 1; i <= 12; i++) {canvas.save();//保存当前画布canvas.rotate(360/12*i,width/2,height/2);//左起:起始位置x坐标,起始位置y坐标,终止位置x坐标,终止位置y坐标,画笔(一个Paint对象)canvas.drawLine(width / 2, height / 2 – circleRadius, width / 2, height / 2 – circleRadius + 30, mPaintCircle);//左起:文本内容,起始位置x坐标,起始位置y坐标,画笔canvas.drawText(“”+i, width / 2, height / 2 – circleRadius + 70, mPaintText);canvas.restore();//}sec = mCalendar.get(Calendar.SECOND);//得到当前秒数float minuteDegree = minute/60f*360;//得到分针旋转的角度canvas.save();canvas.rotate(minuteDegree, width / 2, height / 2);canvas.drawLine(width / 2, height / 2 – 250, width / 2, height / 2 + 40, mPaintMinute);canvas.restore();float hourDegree = (hour*60+minute)/12f/60*360;//得到时钟旋转的角度canvas.save();canvas.rotate(hourDegree, width / 2, height / 2);canvas.drawLine(width / 2, height / 2 – 200, width / 2, height / 2 + 30, mPaintHour);canvas.restore();float secDegree = sec/60f*360;//得到秒针旋转的角度canvas.save();canvas.rotate(secDegree,width/2,height/2);canvas.drawLine(width/2,height/2-300,width/2,height/2+40,mPaintSec);canvas.restore();}}启程了,人的智慧才得以发挥。

Android之自定义View以及画一个时钟

相关文章:

你感兴趣的文章:

标签云: