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.运行后的效果是:

  

  

最新文章

  1. JS定义数组,初始化
  2. canvas :曲线的面积图 加渐变效果
  3. asp.net mvc 通过T4模板生成框架
  4. Collections操作实例
  5. new总结
  6. Delphi-Delete 过程
  7. 30个你不可不知的CSS选择器
  8. 利用PHP SOAP扩展实现简单Web Services
  9. Java动态绑定的内部实现机制
  10. Angular Cookies 操作
  11. linux(十)之初始化文件
  12. BZOJ2748_音量调节_KEY
  13. zoj1109 水题(大神绕道) Language of FatMouse
  14. Rsync(远程同步): linux中Rsync命令的实际示例
  15. Vue 项目代理设置的优化
  16. 1.html基础标签:文本+链接+图片
  17. MyEclipse中把JSP默认编码改为UTF-8
  18. Apache poi简介及代码操作Excel
  19. hdoj1863 畅通工程(Prime || Kruskal)
  20. ubuntu下 mysql安装以后无法登陆的的解决方法((ERROR 1698 (28000): Access denied for user 'root'@'localhost'))

热门文章

  1. 爬虫之 图片懒加载, selenium , phantomJs, 谷歌无头浏览器
  2. 关于电机驱动扩展板 L293D 马达板Arduino
  3. tornado 之 异步非阻塞
  4. 详解Vue2.0生命周期
  5. Python 多进程使用
  6. RocketMQ初探(四)之RocketMQ4.x版本可视化管理控制台rocketmq-console-ng搭建(Apache)
  7. Python 格式化输出 ( 颜色 )
  8. Linux服务管理 systemctl命令详解
  9. 封装baseservice
  10. jqgrid 自动换行