Android自定义View绘制闹钟

本文简单实现了一个闹钟,扩展View,Canvas绘制
效果如下:

代码如下:

package com.gaofeng.mobile.clock_demo;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;import java.util.Calendar;/*** Created by gaofeng on 15-8-29.*/
public class ClockView extends View {public ClockView(Context context) {super(context);ringHourBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ring);ringMinBitmap  = BitmapFactory.decodeResource(getResources(),R.drawable.ring_min);syncTime();setSchedualTime(0);}public ClockView(Context context, AttributeSet attrs) {super(context, attrs);}public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}//半径和圆中心private static final float Radius = 200;private static final float CenterX = 250;private static final float CenterY = 250;private float secondsDegree = 0;private float minDegree = 0;private float hourDegree = 0;//定时private float setHourDegree;private float setMinDegree;private boolean setSchedual;private Bitmap ringHourBitmap;private Bitmap ringMinBitmap;private int bitmapWidth = 30,bitmapHeight = 30;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);try {// 秒表进度Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}setBackgroundColor(Color.GREEN);drawCircle(canvas);drawClockPoint(canvas);drawIndicator(canvas);calc();drawSchedual(canvas);invalidate();}private void drawSchedual(Canvas canvas) {if (setSchedual) {Paint p = new Paint();//找到小时的坐标float rad = (float )Math.toRadians(setHourDegree);float x = (float) (Radius * Math.sin(rad)) ;float y = (float) (Radius * Math.cos(rad));float vx = CenterX + x;float vy = CenterY - y;//比较笨的方法解决 图片绘制在圆内。绘制都是从手机左上角开始的if (setHourDegree > 0 && setHourDegree <= 90) {vx = vx - bitmapWidth;}if (setHourDegree > 90 && setHourDegree < 180) {vx = vx - bitmapWidth;vy = vy - bitmapWidth;}if (setHourDegree > 180 && setHourDegree < 270) {vy = vy - bitmapWidth;}Log.d("","Range x:" + vx + " y:" + vy);canvas.drawBitmap(ringHourBitmap,vx ,vy ,p);//找到分钟的坐标rad = (float )Math.toRadians(setMinDegree);x = (float) (Radius * Math.sin(rad)) ;y = (float) (Radius * Math.cos(rad))  ;vx = CenterX + x;vy = CenterY - y;if (setMinDegree > 0 && setMinDegree <= 90) {vx = vx - bitmapWidth;}if (setMinDegree > 90 && setMinDegree < 180) {vx = vx - bitmapWidth;vy = vy - bitmapWidth;}if (setMinDegree > 180 && setMinDegree < 270) {vy = vy - bitmapWidth;}canvas.drawBitmap(ringMinBitmap,vx,vy ,p);p = null;}}private void calc() {secondsDegree = secondsDegree + 6;if (secondsDegree >=360) { //一圈为一分钟secondsDegree = 0;minDegree = minDegree + 6;}if (minDegree >= 360) { //一圈为一个小时minDegree = 0;hourDegree = hourDegree + 6;}if (hourDegree >= 360) { //一圈还是从0度开始hourDegree = 0;}}//画圆private void drawCircle(Canvas canvas) {Paint paint = new Paint();paint.setColor(Color.RED);paint.setStrokeWidth(2);canvas.drawCircle(CenterX,CenterY,Radius,paint);Paint paint2 = new Paint();paint2.setColor(Color.YELLOW);paint2.setStrokeWidth(15f);canvas.drawPoint(CenterX,CenterY,paint2);}private void drawClockPoint(Canvas canvas) {Paint paint = new Paint();paint.setColor(Color.YELLOW);paint.setStrokeWidth(10f);//画出闹钟上面的刻度值,一圈一共12个点, 360度for (float degree = 0; degree <= 330;degree = degree + 30) {//数学公式 找圆上面的点坐标float rad = (float )Math.toRadians(degree);//转换为度float x = (float) (Radius * Math.sin(rad));float y = (float) (Radius * Math.cos(rad));canvas.drawPoint(x + CenterX, CenterY - y,paint);}}//画指针,转的慢的指针越厚,默认都从0开始转private void drawIndicator(Canvas canvas) {Paint paint = new Paint();paint.setColor(Color.BLACK);paint.setStrokeWidth(3f);//秒针_drawLine(canvas,secondsDegree,paint);//分针paint.setColor(Color.DKGRAY);paint.setStrokeWidth(6f);_drawLine(canvas,minDegree,paint);//时针paint.setColor(Color.WHITE);paint.setStrokeWidth(12f);_drawLine(canvas,hourDegree,paint);}private void _drawLine(Canvas canvas,float degree,Paint paint) {float rad = (float )Math.toRadians(degree);//转换为度float x = (float) (Radius * Math.sin(rad));float y = (float) (Radius * Math.cos(rad));canvas.drawLine(CenterX, CenterY, x + CenterX, CenterY - y, paint);}public void setSchedualTime(long time) {Calendar cal = Calendar.getInstance();cal.setTimeInMillis(time);//演示一下int hour     = 14;int min      = 35;if (hour > 12) { //是24小时类型的hour = hour - 12;}//计算和前面一样setHourDegree = hour * 30;setMinDegree  = min * 6;setSchedual = true;}//和手机时间同步一下public void syncTime() {Calendar cal = Calendar.getInstance();int hour     = cal.get(Calendar.HOUR_OF_DAY);int min      = cal.get(Calendar.MINUTE);int second   = cal.get(Calendar.SECOND);Log.d("","Time Now Hour:" + hour + " Min:" + min + " second:" + second);if (hour > 12) { //是24小时类型的hour = hour - 12;}//计算弧度 每个步伐都是 60/360 = 6度,Hour 12/360 度hourDegree = hour * 30;minDegree  = min * 6;secondsDegree = second * 6;}}

总结
- 没有给钟表绘制数字,这个只是画文本比较简单
- 判断定时图片是否在圆内,做的比较简单没有花太多时间去找方法
- 如果要实现能拖分时指针的 需要扩展ViewGroup

Android自定义View绘制闹钟相关推荐

  1. Android5.0自定义闹钟,Android自定义View 实现闹钟唤起播放闹钟铃声功能

    先上图看一下闹钟唤期页面的效果 实现的功能: 1:转动的图片根据天气情况更换 2:转动时间可以设置,转动结束,闹铃声音就结束 3:光圈颜色渐变效果 直接上代码啦: package com.yuekon ...

  2. android自定义弧度按钮,Android 自定义View 绘制六边形设置按钮

    今天逛酷安的时候,发现酷安的设置按钮(截图的右上角),是一个六边形 + 中心圆的图标,所以又是一个自定义View练习对象了.画圆很简单,知道半径即可,而重点就在画出六边形. 酷安截图.png 最终效果 ...

  3. Android 自定义View绘制电池图标

    /*** @anthor GrainRain* @funcation 自定义View绘制电池* @date 2019/8/27*/ public class DrawBatteryView exten ...

  4. Android自定义View绘制流程

    Android视图层次结构简介 在介绍View绘制流程之前,咱们先简单介绍一下Android视图层次结构以及DecorView,因为View的绘制流程的入口和DecorView有着密切的联系. 我们平 ...

  5. android 自定义View绘制电池电量(电池内带数字显示)

    最新公司需要一个电池内带数字的显示电池电量需求,百度了一下.参考下面这篇文章写的Android自定义View之电池电量显示. 增加了里面电池电量数字显示,还有就是一个屏幕适配.不管屏幕分辨率基本都能适 ...

  6. android画a4矩形,Android自定义View绘制原理:画多大?画在哪?画什么?(三)

    View绘制就好比画画,抛开Android概念,如果要画一张图,首先会想到哪几个基本问题: 画多大? 画在哪? 怎么画? Android绘制系统也是按照这个思路对View进行绘制,上面这些问题的答案分 ...

  7. Android自定义View绘制闪闪发光的文字

    如何实现类似网页效果中闪闪发光的文字,通过自定义View可以实现这一炫酷效果 1.自定义View public class FlickTextView extends TextView {privat ...

  8. Android 自定义View绘制的基本开发流程 Android自定义View(二)

    1 View绘制的过程 View的测量--onMeasure() View的位置确定--onLayout() View的绘制--onDraw() 2 View的测量--onMeasure() Andr ...

  9. Android 自定义View 绘制五角星

    背景 之前写过的App里有评分的功能,而显示评分一般使用系统的RatingBar再加自定义,一切都很完美,但是产品提了一个需求,例如4.6.4.7.5.8分,不要显示为4个星星加一个半星(4.5分), ...

最新文章

  1. 从numpy开启Python数据科学之旅
  2. react-redux的Provider和connect
  3. 8000字 | 32 张图 | 一文搞懂事务+隔离级别+阻塞+死锁
  4. #define宏定义中的#,##,@#,\ 这些符号的神奇用法
  5. UrlRewrite(URL重写)--ASP.NET中的实现
  6. flac3d命令流实例大全_Activiti6.0工作流引擎深度解析
  7. Toontrack Superior Drummer for Mac - 鼓音乐制作工具
  8. phpquery中文手册
  9. Android平板查看网卡mac,如何看电脑网卡和手机mac地址
  10. QPainter画箭头
  11. Swagger 分组配置
  12. 手机wps取消不等宽分栏_wps取消分栏怎么设置
  13. [深度学习基础] 斯坦福CS231n李飞飞计算机视觉Lecture 6笔记
  14. 用计算机知道函数值求度数,怎么计算出余弦的度数
  15. 最全的Python网站开发库!整理出来了!
  16. python合并excel的多个sheet
  17. 设计模式随笔-锦囊妙计
  18. 献给曾经爱过和正在爱的你
  19. Java 9版本之后Base64Encoder和Base64Decoder无法继续使用解决办法
  20. ELISPOT酶联免疫斑点技术

热门文章

  1. 【准备工作—你做好了吗?】
  2. apache drill mysql_Apache Drill嵌入式安装
  3. android 图片拉伸动画,java,Android_Android的属性动画的拉伸效果前后两次效果不一致,求解?,java,Android - phpStudy...
  4. filter函数的使用方法
  5. 舆情监控有哪些分类?
  6. Linux系统配置及服务管理--文件管理
  7. 抖音认证企业号有哪些权益?企业电商该如何带货变晛
  8. IBM的营销策略纲要
  9. Node的介绍和基本使用(更新ing)
  10. 618大战:5G推机潮和5G换机潮的冲突