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. 来谈谈 WebAssembly 是个啥?为何说它会影响每一个 Web 开发者?

    作者:link 原文:What is WebAssembly and why it affects web developers! 你听说过WebAssembly吗?这是由Google, Micros ...

  2. leetcode703

    class KthLargest { public: KthLargest(int k, vector<int> nums) { size = k; for(auto num:nums){ ...

  3. 5.Redis 发布订阅

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub ...

  4. “数据提供程序或其他服务返回 E_FAIL 状态”

    “数据提供程序或其他服务返回 E_FAIL 状态” 的问题 ADO 连接SQL SERVER

  5. 产品负责人(Product Owner)的主要职责和技能

    角色介绍 产品负责人以下简称PO,他是有授权的产品领导力核心,组成Scrum团队三个角色之一. PO担任的是产品经理的角色. PO的主要职责 1.对产品的ROI负责. ROI = profitabil ...

  6. 深入探究jvm之GC的参数调优

    在上一篇博客记录了GC的算法及种类,这篇博客主要记录一下GC的参数如何调整以提高jvm的性能. 一.堆的回顾: 堆的内存空间总体分为新生代和老年代,老年代存放的老年对象,新构造的对象分配在eden区中 ...

  7. IDEA06 代码规范检测插件之Alibaba Java Coding Guidelines

    1 官方资料 1.1 官方介绍 https://mp.weixin.qq.com/s/IbibsXlWHlM59kfXJqRvZA#rd 1.2 github地址 https://github.com ...

  8. Oracle和Mysql的区别 转载

    一.并发性 并发性是oltp数据库最重要的特性,但并发涉及到资源的获取.共享与锁定. mysql:mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他se ...

  9. [C++] the pointer array & the array's pointer

    int *p[4]------p是一个指针数组,每一个指向一个int型的int (*q)[4]---------q是一个指针,指向int[4]的数组 --> type: int(*)[4] vo ...

  10. json操作工具-LitJson

    LitJSON是json生成与读取的操作工具,使用很方便并且网上还能找到源码.下面是使用LitJSON的例子: 一.生成json:实例化一个JsonData,然后按照List数组的方式向里面填. Js ...