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. ORA-00600: 内部错误代码, 参数: [qctcte1]

    [情景再现] 生产环境,JAVA程序某功能报错: ORA-00600: 内部错误代码, 参数: [qctcte1], [0], [], [], [], [], [], [] [问题排查] 1.检查Or ...

  2. 【LUA table 移除操作非常慢】

    LUA的表有插入和删除两种操作.插入操作非常快,100000次操作都在0.01S左右,而删除操作在表元素大于10000时却急速变慢,测试如下: t = {} local t1= os.clock() ...

  3. Mysql 日志文件类型

    简介: Mysql 中提供了多种类型的日志文件,分别反映 Mysql 的不同信息,了解它们很有必要. 1.Error log ( 错误日志 ) 错误日志记录了 Mysql Server 运行过程中所有 ...

  4. 【304】python专题-读取xml文件

    参考:XML DOM 参考手册(w3school) 参考:python专题-读取xml文件 参考:请问用python怎么修改xml的节点值? 1. 读取标签内的文本(Python) 如下的 xml 文 ...

  5. 易捷框架之EChart 的使用

    需要用到百度的报表控件 ,总结如下: 1,先引入开发包,以及主题包: <%@ include file="./common/echarts_header.jsp"%> ...

  6. django-rest-swagger

    前提工作 pip3 install --user django>=2.0.0 pip3 install --user django-rest-swagger 安装完成之后,创建一个django项 ...

  7. IE WebDeveloper--IE浏览器web调试工具

    目前市面上比较火爆的浏览器内核提供商,有微软的IE.mozilla的firefox.谷歌的chrome.苹果的safari.IE浏览器下的项目过去占比非常大,近年随着其他浏览器厂商发展势头迅猛,过去的 ...

  8. 在Ajax请求中什么时候用GET方式什么时候用POST方式?

    当我们有大量数据要传送时最好的办法是一次发出多个只传递少量信息的Ajax调用时.如果你正用一个Ajax调用发送大量数据,那么最好是结束这种做法,因为这样做并不能节约时间. 因此,需要传送大量数据能成为 ...

  9. Storm配置说明

    配置项 配置说明 storm.zookeeper.servers ZooKeeper服务器列表 storm.zookeeper.port ZooKeeper连接端口 storm.local.dir s ...

  10. Linux实战教学笔记52:GlusterFS分布式存储系统

    一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...