自定义表盘

来源:互联网 发布:音墙网络 编辑:程序博客网 时间:2024/03/28 16:40
<pre name="code" class="html">package com.paad.compass;import android.content.Context;import android.content.res.Resources;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class MyCompass extends View {private Paint criclePaint;private Paint markPaint;private Paint textPaint;private int degree = 0;public MyCompass(Context context) {super(context);// TODO Auto-generated constructor stubinitView(context);}public MyCompass(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView(context);}public MyCompass(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinitView(context);}private void initView(Context context) {Resources r = context.getResources();criclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);criclePaint.setColor(r.getColor(R.color.background_color));criclePaint.setStrokeWidth(1);criclePaint.setStyle(Paint.Style.FILL_AND_STROKE);markPaint = new Paint(Paint.ANTI_ALIAS_FLAG);markPaint.setColor(r.getColor(R.color.marker_color));textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);textPaint.setColor(r.getColor(R.color.text_color));}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubint cx = getMeasuredWidth() / 2;int cy = getMeasuredHeight() / 2;int radius = cx;canvas.drawCircle(cx, cy, radius, criclePaint);canvas.save();//保存背景for (int i = 0; i < 60; i++) {canvas.save();//保存绘制前状态int startX = cx;int startY = cy - radius;int stopX = cx;int stopY = startY + 10;int h = (int) markPaint.measureText("Y");String text = "";if (i % 15 == 0) {switch (i) {case 0:text = "12";break;case 15:text = "3";break;case 30:text = "6";break;case 45:text = "9";break;}int textH = (int) textPaint.measureText("W");canvas.drawText(text, startX - textH / 2, startY + 10 + 2 * h,textPaint);canvas.drawLine(startX, startY, stopX, stopY+5, markPaint);}else{canvas.drawLine(startX, startY, stopX, stopY, markPaint);}canvas.translate(0, h);canvas.restore();//恢复到绘制前状态,清除上面的translate(0, h)动作。准备下一次绘绘制canvas.rotate(6, cx, cy);}canvas.save();canvas.rotate((int)degree, cx, cy);int h = (int) markPaint.measureText("Y");canvas.drawLine(cx-5, cy-radius + 25 + 3 * h, cx, cy-radius + 20 + 2 * h, markPaint);canvas.drawLine(cx+5, cy-radius + 25 + 3 * h, cx, cy-radius + 20 + 2 * h, markPaint);canvas.restore();//清除上面的canvas.rotate((int)degree, cx, cy);动作canvas.restore();//恢复到背景handler.sendEmptyMessageDelayed(0, 1000);}Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubLog.d("tag", "degree="+degree);if(degree>=360){degree = 0;}invalidate();degree+=6;}};@Overrideprotected void onLayout(boolean changed, int left, int top, int right,int bottom) {// TODO Auto-generated method stubsuper.onLayout(changed, left, top, right, bottom);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubint specW = measure(widthMeasureSpec);int specH = measure(heightMeasureSpec);int d = Math.min(specW, specH);setMeasuredDimension(d, d);}private int measure(int size) {int result = 0;int specMode = MeasureSpec.getMode(size);int specSize = MeasureSpec.getSize(size);if (specMode == MeasureSpec.UNSPECIFIED) {result = 200;} else {result = specSize;}return result;}}

<?xml version="1.0" encoding="utf-8"?><resources>  <color name="background_color">#F555</color>  <color name="marker_color">#AFFF</color>  <color name="text_color">#AFFF</color></resources>


                                             
0 0
原创粉丝点击