private Context mContext; /** * 画笔 */ private Paint mPaint; /** * 控件的宽 */ private int mWidth; /** * x方向的圆心坐标 */ private int center; /** * 钟表的半径 */ private int mRadio; /** * 圆环的宽 */ private int strokeWidth = 8; /** * 当前小时 */ private int mCurrentHour; /** * 当前分钟 */ private int mCurrentMinute; /** * 当前秒 */ private int mCurrentSecond; /** * 时针的长度 */ private int hourLineLen; /** * 分针的长度 */ private int minuteLineLen; /** * 秒针的长度 */ private int secondLineLen; /** * 时针扫过的角度 */ private int hourDegree; /** * 分针扫过的角度 */ private int minuteDegree; /** * 秒针扫过的角度 */ private int secondDegree; /** * 时针,分针,秒针的终点坐标 */ private int hourEndX; private int hourEndY; private int minuteEndX; private int minuteEndY; private int secondEndX; private int secondEndY; private int mHeight; private String TAG="ClockView"; public ClockView(Context context) { this(context,null); } public ClockView(Context context, @Nullable AttributeSet attrs) { this(context,attrs,0); } public ClockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿 mPaint.setColor(Color.RED); new Thread(new Runnable() { @Override public void run() { Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { postInvalidate(); } }; timer.schedule(task, 1000, 1000); } }).start(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mWidth = w; mHeight = h; if (mWidth>mHeight){//以短边为半径 mRadio=mHeight/2; }else { mRadio=mWidth/2; } super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mWidth = getWidth(); center = mWidth / 2; // 圆心 x mRadio = center - strokeWidth / 2; // 半径 hourLineLen = mRadio - 200; // 时针长度 minuteLineLen = mRadio - 120; // 分针长度 secondLineLen = mRadio - 80; // 秒针长度 // 画一个中心 canvas.drawCircle(center, center, 10, mPaint); // 设置为空心 mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(strokeWidth); // 画圆 canvas.drawCircle(center, center, mRadio, mPaint); // 画刻度 for (int i = 0; i < 60; i++) { if (i % 5 == 0) { // 整点 canvas.drawLine(center, 0, center, 40, mPaint); //这里不能花数字,因为画出来都是带旋转角度的 } else { // 非整点 canvas.drawLine(center, 0, center, 20, mPaint); } // 旋转画布 canvas.rotate(6, center, center); } // 画数字 for (int i = 0; i < 12; i++) { mPaint.setTextSize(40); float textSize = mPaint.getTextSize(); String clockText = i==0?"12":i+""; int degree = i * 30; double deg = Math.PI * degree / 180; float x = center + Double.valueOf(4*mRadio/5 * Math.sin(deg)).floatValue(); float y = center - Double.valueOf(4*mRadio/5 * Math.cos(deg)).floatValue(); Log.i(TAG, "onDraw: "+x); canvas.drawText(clockText, x-textSize/2, y+textSize/2, mPaint); } // 获取当前时间 initCurrentTime(); // 画秒针 canvas.drawLine(center, center, secondEndX, secondEndY, mPaint); // 画分针 canvas.drawLine(center, center, minuteEndX, minuteEndY, mPaint); // 画时针 mPaint.setStrokeWidth(15); canvas.drawLine(center, center, hourEndX, hourEndY, mPaint); } /** * 初始化当前时间,计算时针分针的终点坐标 */ private void initCurrentTime() { // 获取当前时间 SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); String time = format.format(new Date()); String result[] = time.split(":"); mCurrentHour = Integer.parseInt(result[0]); mCurrentMinute = Integer.parseInt(result[1]); mCurrentSecond = Integer.parseInt(result[2]); mCurrentHour = mCurrentHour >= 12 ? mCurrentHour - 12 : mCurrentHour; mCurrentMinute = mCurrentHour == 60 ? 0 : mCurrentMinute; mCurrentSecond = mCurrentSecond == 60 ? 0 : mCurrentSecond; // 秒针角度 secondDegree = mCurrentSecond * 6; // 分针角度 minuteDegree = mCurrentMinute * 6; // 时针角度(还要考虑分针角度) hourDegree = mCurrentHour * 30 + Double.valueOf(30 * (minuteDegree*1.0 / 360)).intValue(); // 换算成弧度 double hourDeg = Math.PI * hourDegree / 180; double minuteDeg = Math.PI * minuteDegree / 180; double secondDeg = Math.PI * secondDegree / 180; // 计算指针终点坐标 hourEndX = center + Double.valueOf(hourLineLen * Math.sin(hourDeg)).intValue(); hourEndY = center - Double.valueOf(hourLineLen * Math.cos(hourDeg)).intValue(); minuteEndX = center + Double.valueOf(minuteLineLen * Math.sin(minuteDeg)).intValue(); minuteEndY = center - Double.valueOf(minuteLineLen * Math.cos(minuteDeg)).intValue(); secondEndX = center + Double.valueOf(secondLineLen * Math.sin(secondDeg)).intValue(); secondEndY = center - Double.valueOf(secondLineLen * Math.cos(secondDeg)).intValue(); }
02-26
246
04-06
12-19
2597
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交