canvas绘制时钟刻度表

1.首先看一下效果图

2.基本知识点

canvas.drawText:绘制文字,注意基线的位置为文字的左下角y轴所在的线

canvas.drawLine:绘制线段,指定起始位置就好

canvas.save:保存canvas的状态,比如translate平移之前或者rotate(单位为°,正为顺时针)旋转之前的状态

canvas.restore:恢复到保存时候的canvas状态,这么理解:translate平移了坐标,从初始位置屏幕左上角(0,0)到屏幕中间(mWidth/2,mHeight/2),这时候如果我们在平移之前保存了canvas的状态,要想恢复到平移之前的状态就可以使用canvas.restore,rotate旋转类似

3.分析

1.首先绘制一个屏幕正中心得描边的空心圆

2.绘制刻度线和几点,首先绘制0点的刻度线和0,然后canvas绕着中心点顺时针旋转15°,然后绘制1点,2点。。。

3.绘制两根指针,起始点为(0,0),那么我们可以把坐标通过translate平移到中心点位置,然后绘制两根指针就很容易了

4.实战

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;/*** Created by m1312 on 2018/5/5.* 绘制时钟*/public class ClockView extends View {private Paint mCirclePaint;private Paint mDegreePaint;private Paint mHourPaint;private Paint mMinutePaint;private int mWidth;private int mHeight;public ClockView(Context context) {super(context);init();}public ClockView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}public ClockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {mCirclePaint = new Paint();mCirclePaint.setStyle(Paint.Style.STROKE);mCirclePaint.setAntiAlias(true);mCirclePaint.setStrokeWidth(5);mDegreePaint = new Paint();mDegreePaint.setStrokeWidth(3);mDegreePaint.setColor(Color.BLACK);mHourPaint = new Paint();mHourPaint.setStrokeWidth(20);mMinutePaint = new Paint();mMinutePaint.setStrokeWidth(10);WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);mWidth = windowManager.getDefaultDisplay().getWidth();mHeight = windowManager.getDefaultDisplay().getHeight();}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawCircle(mWidth/2,mHeight/2,mWidth/2,mCirclePaint);for(int i = 0;i<24;i++){if(i == 0 || i == 6 || i == 12 || i == 18){mDegreePaint.setStrokeWidth(5);mDegreePaint.setTextSize(30);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+60,mDegreePaint);String degree = String.valueOf(i);canvas.drawText(degree,mWidth/2-mDegreePaint.measureText(degree)/2,mHeight/2-mWidth/2+90,mDegreePaint);}else{mDegreePaint.setStrokeWidth(3);mDegreePaint.setTextSize(15);canvas.drawLine(mWidth/2,mHeight/2-mWidth/2,mWidth/2,mHeight/2-mWidth/2+30,mDegreePaint);String degree = String.valueOf(i);canvas.drawText(degree,mWidth/2-mDegreePaint.measureText(degree)/2,mHeight/2-mWidth/2+60,mDegreePaint);}canvas.rotate(15,mWidth/2,mHeight/2);}canvas.save();canvas.translate(mWidth/2,mHeight/2);canvas.drawLine(0,0,100,100,mHourPaint);canvas.drawLine(0,0,100,200,mMinutePaint);canvas.restore();//测试save和restore的作用mDegreePaint.setTextSize(50);canvas.drawText("hahah",100,100,mDegreePaint);}}

canvas绘制时钟刻度表相关推荐

  1. canvas绘制时钟

    听了慕课网Sliav Zhou 的课程canvas绘制时钟,记录下来的代码,每句做了注解便于以后学习,原先每次边听别的课边敲码,错误百出,明明原封不动复制的代码,就会出错,还找不到原因,今天可能运气好 ...

  2. html5时间画布走动,javascript+HTML5 canvas绘制时钟功能示例

    本文实例讲述了javascript+HTML5 canvas绘制时钟功能.分享给大家供大家参考,具体如下: 效果如下: 代码: www.jb51.net canvas绘制时钟 div{text-ali ...

  3. 使用canvas绘制时钟

    使用canvas绘制时钟  什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...

  4. html5canvas绘制时钟,JavaScript html5 canvas绘制时钟效果

    本文实例讲述了JavaScript+html5 canvas绘制时钟效果.分享给大家供大家参考,具体如下: HTML部分: canvas绘图 JavaScript部分: function init() ...

  5. html5的canvas绘制时钟

    为什么80%的码农都做不了架构师?>>>    最近一直在学习html5,学到了html5的canvas标签,这个画布真的是很强大,它有对应的javascript的api的支持,你可 ...

  6. canvas绘制时钟表盘

    关于canvas的API操作详情请阅读文档https://www.runoob.com/html/html5-canvas.html 先来看下效果图: 首先,需要绘制两个圆形作为表盘 var draw ...

  7. Canvas绘制一个时钟

    Canvas绘制一个时钟 Canvas:一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素.它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处 ...

  8. Canvas之绘制时钟

    使用canvas绘制时钟效果 创建一个canvas之后拥有三要素: id--画布的唯一标识 width--画布的宽 height--画布的高 **强烈建议不要使用css修改画布的宽高,因为画布的宽高表 ...

  9. canvas 画布绘制时钟

    利用canvas绘制时钟的一个小demo <!--* @Author: 164591357@qq.com 164591357@qq.com* @Date: 2022-08-06 11:04:07 ...

最新文章

  1. Rails字符集问题
  2. DayDayUp:那些属于程序猿江湖的鄙视链(看完别笑^~^,哈哈,haha)
  3. linux fedora35设置双系统开机启动顺序
  4. thinkphp curd的事务回滚 一看就会
  5. 电为啥要分交流、直流?
  6. UVA485 Pascal‘s Triangle of Death【大数】
  7. obs 推流编码在哪设置_斗鱼用obs直播的串流码填什么呀 新手 不懂
  8. Machine Learning - Coursera 吴恩达机器学习教程 Week4 学习笔记
  9. 基于Vue的俄罗斯方块游戏设计与实现
  10. 无线鼠标vs蓝牙鼠标
  11. 评论中发emoji表情 iOS
  12. Android 控制屏幕唤醒常亮或熄灭
  13. 企业高管跳槽区块链,跳的是“坑”还是“槽”?
  14. java 小工 到_测试小工——从0到1搭建最简单的Linux网站
  15. 基于Web的图书管理系统设计与实现(附源码地址)
  16. 平面/空间杆系结构有限元编程计算(MATLAB)
  17. 【2018国赛线上初赛】知识问答题真题演练第三波
  18. “/wechat”应用程序中的服务器错误。
  19. Adobe flash plugin插件的安装
  20. 深度学习与视频编解码算法一

热门文章

  1. python无法加载文件系统代码_致命的Python错误:initfsencoding:无法加载文件系统cod...
  2. linux将tick变成日期,Linux时间子系统之:Tick Device layer综述
  3. 专访 | 数据库厂商都怕低价竞争?阿里云说并不可惧
  4. USB等高速差分信号是否需要包地?
  5. 如何通过java股票数据接口实现股票的自动化交易?
  6. Elasticsearch整合Springboot实现基本的全文检索
  7. 【Cascade FPD】《Deep Convolutional Network Cascade for Facial Point Detection》
  8. Invalid use of argument matchers
  9. 常见的 CSRF、XSS、sql注入、DDOS流量攻击
  10. 疾风电竞显示器,让你享受快人一步的游戏体验