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

2.思路:

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

3.直接上代码:

  

 public class AlarmClockView extends View {

     private static final PorterDuff.Mode MODE = PorterDuff.Mode.DST_OUT;
/**
* 屏幕适应性参数
*/
private static final float BIG_RADIU = 1 / 6F;
private static final float SMALL_RADIU = 1 / 12F;
private static final float CLOCKWISE_LENGTH = 1 / 10F;
private static final float MINUTE_LENGTH = 1 / 12f;
private static final float MASK_RADIU = 1 / 4F; // 大圆盘圈
private Paint mPaint;
// 指针Paint
private Paint zhenPaint;
// 小圆Paint
private Paint smallCirclePaint;
private Path path;
private int screenW, screenH;
/**
* 大圆半径
*
* @param context
*/
private float radius_big, small_radiu, clockwise_length, minute_length,
mask_radiu; public AlarmClockView(Context context) {
super(context);
} public AlarmClockView(Context context, AttributeSet attrs) {
super(context, attrs); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(40); zhenPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
zhenPaint.setStyle(Paint.Style.STROKE);
zhenPaint.setColor(Color.WHITE);
zhenPaint.setStrokeWidth(20); smallCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
smallCirclePaint.setStyle(Paint.Style.FILL);
smallCirclePaint.setColor(Color.WHITE); screenW = new MeasureUtil().getWindowWidth(context);
screenH = new MeasureUtil().getWindowHeigh(context); int size = Math.min(screenW, screenH);
radius_big = size * BIG_RADIU;
small_radiu = size * SMALL_RADIU;
clockwise_length = size * CLOCKWISE_LENGTH;
minute_length = size * MINUTE_LENGTH;
mask_radiu = size * MASK_RADIU;
// 设置指针
path = new Path();
path.moveTo(screenW / 2, screenH / 2 + 10);
path.lineTo(screenW / 2, screenH / 2 - clockwise_length + 10);
path.moveTo(screenW / 2 - 10, screenH / 2 + 10);
path.lineTo(screenW / 2 + minute_length, screenH / 2 + 10);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.argb(255, 255, 128, 103)); canvas.drawCircle(screenW / 2, screenH / 2, radius_big, mPaint);
canvas.drawPath(path, zhenPaint); // 画耳朵圆
drawEarCircle(canvas, 30);
drawEarCircle(canvas, -30); } private void drawEarCircle(Canvas canvas, int degree) {
int layerID = canvas.saveLayer(0, 0, screenW, screenH, null,
Canvas.ALL_SAVE_FLAG);
canvas.rotate(degree, screenW / 2, screenH / 2);
canvas.drawCircle(screenW / 2, screenH / 2 - radius_big - small_radiu,
small_radiu, smallCirclePaint);
// 用一个大圆去遮罩
PorterDuffXfermode xfermode = new PorterDuffXfermode(MODE);
smallCirclePaint.setXfermode(xfermode);
canvas.drawCircle(screenW / 2, screenH / 2, mask_radiu,
smallCirclePaint);
smallCirclePaint.setXfermode(null);
canvas.restoreToCount(layerID);
} }

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. [Z]CiteSeer统计的计算机领域的期刊和会议的影响因子

    稍微有点早,04年的,但很全 http://emuch.net/html/200510/128286.html 另附一个不明来路的排名:http://www.wi2.uni-erlangen.de/_ ...

  2. 使用JAVA爬取京东商品价格

    有一件物品,你想看看它在京东下所有搜索结果的价格,要怎么办呢? 京东这个网站还是很好爬的,所有价格信息都写在了Html里面,而且跳到第二页之后,url也是有规律的,基本没有什么技术难度. 例如:想找i ...

  3. C# 鼠标穿透窗体与恢复

    转自原文 C# 鼠标穿透窗体与恢复 引入user32.dll [DllImport("user32.dll")] public static extern uint SetWind ...

  4. java第三方类库实现图片等比缩放

    public class ThumbnailTest { public static void main(String[] args) { InputStream is = null; try { / ...

  5. NSTimer类的使用

    转载于:http://www.cnblogs.com/wujian1360/archive/2011/09/05/2167992.html 创建一个 Timer + scheduledTimerWit ...

  6. 【原】Coursera—Andrew Ng机器学习—Week 9 习题—异常检测

    [1]异常检测 [2]高斯分布 [3]高斯分布 [4] 异常检测 [5]特征选择 [6] [7]多变量高斯分布 Answer: ACD B 错误.需要矩阵Σ可逆,则要求m>n  测验1 Answ ...

  7. PHP笔试题及答案

    1.表单提交get和post有何区别? 答:get的方式是把数据在地址栏中发送,get传送的数据量较小,不能大于2KB.post传送的数据量较大,一般被默认为不受限制.但理论上,IIS4中最大量为80 ...

  8. Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践

    1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...

  9. java算法 蓝桥杯算法训练 Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  10. scala的隐式转换

    摘要: 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,这种特性可以极大的减少代码量,忽略那些冗长,过于细节的代码.   使用方式: 1. ...