android 自定义view实现时钟
2016-09-01 14:08
429 查看
package com.domain.zjl.androidhero; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.view.View; import java.util.Calendar; /** * Created by xiaoji94shen on 2016/9/1. */ public class MyClockView extends View { private Handler mHandler; private Runnable mRunnable; private Paint mPaint; public MyClockView(Context context) { super(context); init(); } public MyClockView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mHandler = new Handler(); initPaint(); mRunnable = new Runnable() { @Override public void run() { postInvalidate(); mHandler.postDelayed(this, 1000); } }; mHandler.postDelayed(mRunnable, 1000); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawBigCircle(canvas); drawLinesAndNumbers(canvas); drawPoint(canvas); drawLines(canvas); } private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLACK); } private void drawLines(Canvas canvas) { Calendar calendar = Calendar.getInstance(); float hour = calendar.get(Calendar.HOUR); float min = calendar.get(Calendar.MINUTE); float secode = calendar.get(Calendar.SECOND); mPaint.setStyle(Paint.Style.FILL); float startX = getWidth() / 2; float endX = startX; float startY = getHeight() / 2; float endY = startY - 80; canvas.save(); float hourDegree = (hour + min / 60) * (360 / 12); canvas.rotate(hourDegree, getWidth() / 2, getHeight() / 2); canvas.drawLine(startX, startY, endX, endY, mPaint); canvas.restore(); canvas.save(); float minDegree = (min + secode / 60) * 360 / 60; canvas.rotate(minDegree, getWidth() / 2, getHeight() / 2); canvas.drawLine(startX, startY, endX, endY - 20, mPaint); canvas.restore(); canvas.save(); float secondeDegree = secode * 360 / 60; canvas.rotate(secondeDegree, getWidth() / 2, getHeight() / 2); canvas.drawLine(startX, startY, endX, endY - 40, mPaint); canvas.restore(); } private void drawPoint(Canvas canvas) { mPaint.setStyle(Paint.Style.FILL); canvas.drawCircle(getWidth() / 2, getHeight() / 2, 6, mPaint); } private void drawBigCircle(Canvas canvas) { mPaint.setStyle(Paint.Style.STROKE); canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - 4, mPaint); } private void drawLinesAndNumbers(Canvas canvas) { canvas.save(); int logHeight = 16; int shortHeight = 8; int startX = getWidth() / 2; int stopX = startX; int radius = getWidth() / 2 - 4; int startY = getHeight() / 2 - radius; int stopY = 0; int degree = 360 / 60; mPaint.setStyle(Paint.Style.FILL); mPaint.setTextSize(25); String[] numbers = new String[]{"12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"}; int j = 0; for (int i = 0; i < 60; i++) { if (i % 5 == 0) { stopY = startY + logHeight; j++; } else { stopY = startY + shortHeight; } canvas.drawLine(startX, startY, stopX, stopY, mPaint); if (i % 5 == 0) { String num = numbers[j - 1]; Rect textBounds = new Rect(); mPaint.getTextBounds(num, 0, num.length(), textBounds); int textStartX = (int) (startX - mPaint.measureText(num) / 2); int textStartY = (int) (stopY + textBounds.height()) + 2; canvas.drawText(numbers[j - 1], textStartX, textStartY, mPaint); } canvas.rotate(degree, getWidth() / 2, getHeight() / 2); } canvas.restore(); } }
相关文章推荐
- Android自定义View——实现时钟效果
- Android自定义ClockView实现时钟效果
- Android自定义View:如何实现一个模拟时钟?
- android自定义view(实现时钟显示)
- android 让TextView支持的Html标签实现自定义时钟显示组件DigitalClock
- Android自定义View实现时钟效果ClockView
- Android自定义View----时钟/仪表盘的简单实现
- Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义新手指引控件.
- android自定义View实现裁剪图片功能,不使用系统的
- android 自定义textView,实现排版对齐和换行
- Android开发中自定义View设定到FrameLayout布局中实现多组件显示
- android之自定义ViewGroup和自动换行的布局的实现
- android 腾讯微博分享功能实现及自定义webview认证
- android之自定义ViewGroup和自动换行的布局的实现
- Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义新手指引控件.
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu
- android:自定义viewgroup,并实现滚动条和换行
- Android自定义View设定到FrameLayout布局中实现多组件显示
- Android自定义View实现
- android之自定义ViewGroup和自动换行的布局的实现