1.今天就来模仿一下这个小闹钟的

2.思路:

  • 先画闹钟的圆盘 ,在通过Path来画指针
  • 两个耳朵其实就是用两个圆被一个大圆截取后留下的,并旋转一定度数后生成

3.直接上代码:

  

  1. public class AlarmClockView extends View {
  2.  
  3. private static final PorterDuff.Mode MODE = PorterDuff.Mode.DST_OUT;
  4. /**
  5. * 屏幕适应性参数
  6. */
  7. private static final float BIG_RADIU = 1 / 6F;
  8. private static final float SMALL_RADIU = 1 / 12F;
  9. private static final float CLOCKWISE_LENGTH = 1 / 10F;
  10. private static final float MINUTE_LENGTH = 1 / 12f;
  11. private static final float MASK_RADIU = 1 / 4F;
  12.  
  13. // 大圆盘圈
  14. private Paint mPaint;
  15. // 指针Paint
  16. private Paint zhenPaint;
  17. // 小圆Paint
  18. private Paint smallCirclePaint;
  19. private Path path;
  20. private int screenW, screenH;
  21. /**
  22. * 大圆半径
  23. *
  24. * @param context
  25. */
  26. private float radius_big, small_radiu, clockwise_length, minute_length,
  27. mask_radiu;
  28.  
  29. public AlarmClockView(Context context) {
  30. super(context);
  31. }
  32.  
  33. public AlarmClockView(Context context, AttributeSet attrs) {
  34. super(context, attrs);
  35.  
  36. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  37. mPaint.setStyle(Paint.Style.STROKE);
  38. mPaint.setColor(Color.WHITE);
  39. mPaint.setStrokeWidth(40);
  40.  
  41. zhenPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  42. zhenPaint.setStyle(Paint.Style.STROKE);
  43. zhenPaint.setColor(Color.WHITE);
  44. zhenPaint.setStrokeWidth(20);
  45.  
  46. smallCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  47. smallCirclePaint.setStyle(Paint.Style.FILL);
  48. smallCirclePaint.setColor(Color.WHITE);
  49.  
  50. screenW = new MeasureUtil().getWindowWidth(context);
  51. screenH = new MeasureUtil().getWindowHeigh(context);
  52.  
  53. int size = Math.min(screenW, screenH);
  54. radius_big = size * BIG_RADIU;
  55. small_radiu = size * SMALL_RADIU;
  56. clockwise_length = size * CLOCKWISE_LENGTH;
  57. minute_length = size * MINUTE_LENGTH;
  58. mask_radiu = size * MASK_RADIU;
  59. // 设置指针
  60. path = new Path();
  61. path.moveTo(screenW / 2, screenH / 2 + 10);
  62. path.lineTo(screenW / 2, screenH / 2 - clockwise_length + 10);
  63. path.moveTo(screenW / 2 - 10, screenH / 2 + 10);
  64. path.lineTo(screenW / 2 + minute_length, screenH / 2 + 10);
  65. }
  66.  
  67. @Override
  68. protected void onDraw(Canvas canvas) {
  69. super.onDraw(canvas);
  70. canvas.drawColor(Color.argb(255, 255, 128, 103));
  71.  
  72. canvas.drawCircle(screenW / 2, screenH / 2, radius_big, mPaint);
  73. canvas.drawPath(path, zhenPaint);
  74.  
  75. // 画耳朵圆
  76. drawEarCircle(canvas, 30);
  77. drawEarCircle(canvas, -30);
  78.  
  79. }
  80.  
  81. private void drawEarCircle(Canvas canvas, int degree) {
  82. int layerID = canvas.saveLayer(0, 0, screenW, screenH, null,
  83. Canvas.ALL_SAVE_FLAG);
  84. canvas.rotate(degree, screenW / 2, screenH / 2);
  85. canvas.drawCircle(screenW / 2, screenH / 2 - radius_big - small_radiu,
  86. small_radiu, smallCirclePaint);
  87. // 用一个大圆去遮罩
  88. PorterDuffXfermode xfermode = new PorterDuffXfermode(MODE);
  89. smallCirclePaint.setXfermode(xfermode);
  90. canvas.drawCircle(screenW / 2, screenH / 2, mask_radiu,
  91. smallCirclePaint);
  92. smallCirclePaint.setXfermode(null);
  93. canvas.restoreToCount(layerID);
  94. }
  95.  
  96. }

4.运行后的效果是:

  

  

Android 画闹钟的更多相关文章

  1. Android 实现闹钟功能

      原文地址:Android 实现闹钟功能作者:Android_Learners 一.手机闹钟主要用到了AlarmManager类,AlarmManager类提供了访问系统定时服务的途径,开发人员可以 ...

  2. 基于Android的闹钟的软件

    一.本课题要求:设计一个基于Android的闹钟的软件. 实现的功能有:能通过界面设置闹钟的启动条件建立后台服务进程,当满足触发条件时,闹钟响应相应事件. 二.需求分析 该课题实现在手机操作系统And ...

  3. android 画虚线、实线,画圆角矩形,一半圆角

    1.画虚线,实线: 建立dotted_line_gray.xml文件放在drawable文件夹下面. android:shape="line" 可以修改你想要的形状 <?xm ...

  4. Android 小闹钟程序

    最近写了个闹钟的程序,看到SharedPreferences在一个程序中可以共享数据,SharedPreferences是一个轻量级的键值存储机制,只可以存储基本数据类型.我就拿来用用,没想到Shar ...

  5. android画虚线的自定义VIew

    package com.yesway.ycarplus.view; import android.annotation.SuppressLint; import android.content.Con ...

  6. Android画一个随意拖动的圆形

    import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactor ...

  7. Android 获取闹钟引发的血案

    想做一个锁屏的软件.锁屏后可以显示闹钟信息. 一开始的思路是通过android content provider获取 mActivityObject.getContentResolver().quer ...

  8. Android 画个电池出来(Paint和canvas)

    1.Android中很多时候都要自己去画一个自定义控件出来,就需要用到Paint和Canvas这两个类. 2.效果图:

  9. Android反复闹钟(每天)的实现

    MainActivity例如以下: package cc.cc; import java.util.Calendar; import java.util.Locale; import android. ...

随机推荐

  1. 「小程序JAVA实战」小程序我的个人信息-注销功能(42)

    转自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/ 注 ...

  2. 3DMAX导出FBX的烘焙动画选项

    勾选了 [烘焙动画]选项时,表示由骨骼动画塌陷为逐帧动画,这样的结果就是:导出的动画确保是正确的,但体积增大,这是骨骼动画与逐帧去画的区别所在. 如果不勾选此选项,则导出的是骨骼动画,可能出现一些问题 ...

  3. 一条跨库更新数据的sql

    UPDATE [db1].[dbo].[R_ResAndBook]     SET SectionID=TT2.newsecidFROM [SmartCampus].[dbo].[R_ResAndBo ...

  4. C#匿名类型 - Anonymous Types

    [C#匿名类型 - Anonymous Types] Anonymous types provide a convenient way to encapsulate a set of read-onl ...

  5. SaltStack 运行机理特点

    SaltStack 运行机理特点 1.实时通讯(REAL-TIME COMMUNICATION) 所有 Salt minions 接收命令都是同时的,这意味着控制 10 个或者 10000 个系统所消 ...

  6. 前端 webpack

    前端 webpack http://www.cnblogs.com/lvdabao/

  7. js使用浏览器的另存为下载文件

    页面上的页面如下: 我需要根据返回的url下载文件: js: //判断浏览器类型 function myBrowser(){ var userAgent = navigator.userAgent; ...

  8. unity与android交互总结

    http://www.jianshu.com/p/4739ce2f4cd1 http://www.cnblogs.com/suoluo/p/5443889.html http://www.th7.cn ...

  9. Ztree右键事件,如何让指定的子节点不显示右键菜单。

    这里我记录一下我自己的解决方案: 1.首先在Ztree的setting设置中加一个鼠标右键回调函数onRightClick,然后在加一个beforeRightClick(具体含义可以看官方API) v ...

  10. sourcetree免注册方法

    step1: https://www.sourcetreeapp.com/官网下载windows版软件 step2: 右键-->以管理员身份运行,便安装成功了 step3: 安装好之后会有这么一 ...