iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android画个时钟玩玩
  • 809
分享到

Android画个时钟玩玩

Android 2022-06-06 09:06:55 809人浏览 薄情痞子
摘要

本文实例为大家分享了Android实现时钟效果的具体代码,供大家参考,具体内容如下 先看下最终的效果   开始实现 新建一个ClockView集成View publ

本文实例为大家分享了Android实现时钟效果的具体代码,供大家参考,具体内容如下

先看下最终的效果

 

开始实现

新建一个ClockView集成View


public class ClockView extends View {
 }

先重写onMeasure方法,这里要先说一下View的测量模式,一共有三种:

1、EXACTLY

即精确值模式,当我们将控件的layout_width属性或layout_height属性指定为具体数值时,比如android:layout_width="100dp",或者指定为math_parent属性时(占据父View的大小),系统使用的是EXACTLY模式。

2、AT_MOST

即最大值模式,当控件的layout_width属性或layout_height属性指定为wrap_content时,控件大小一般随着控件的子控件或内容的变化而变化,此时控件的尺寸只要不超过父控件允许的最大尺寸即可。

3、UNSPECIFIED

这个属性比较奇怪——它不指定其大小测量模式,View想多大就多大,通常情况下在绘制自定义View时才会使用。

因为View的onMeasure方法只支持EXACTLY模式,当layout_width和layout_height为wrap_content时,View的大小就显得很奇怪了,如下图。

所以我们重写一下onMeasure方法可以指定View width、height的最小值


 
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  setMeasuredDimension(measure(widthMeasureSpec), measure(heightMeasureSpec));
 }
 private int measure(int origin){
  int result = DEFAULT_MIN_WIDTH;
  int specMode = MeasureSpec.getMode(origin);
  int specSize = MeasureSpec.getSize(origin);
  if(specMode == MeasureSpec.EXACTLY){
   result = specSize;
  }else{
   if(specMode == MeasureSpec.AT_MOST){
    result = Math.min(result, specSize);
   }
  }
  return result;
 }

下面就是最重要的重写onDraw方法来绘制表盘、刻度、指针……,大致流程如下
1、画表盘,用drawCircle绘制一个圆作为表盘, 圆心坐标为(getWidth()/2, getHeight()/2),半径为Math.min(getHeight()/2, getWidth()/2)。


//画外圆
float borderWidth = DEFAULT_BORDER_WIDTH;
Paint paintCircle = new Paint();
paintCircle.setStyle(Paint.Style.STROKE);
paintCircle.setAntiAlias(true);
paintCircle.setStrokeWidth(borderWidth);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, Math.min(getHeight() / 2, getWidth() / 2) - borderWidth / 2, paintCircle);

2、画刻度线在这里我们可以利用一个`canvas.rotate'方法就可以不用计算角度了


//画刻度线
float degreeLength = 0f;
Paint paintDegree = new Paint();
paintDegree.setAntiAlias(true);
for(int i=0;i<60;i++){
 if(i % 5 == 0){
  paintDegree.setStrokeWidth(6);
  degreeLength = DEFAULT_LONG_DEGREE_LENGTH;
 }else{
  paintDegree.setStrokeWidth(3);
  degreeLength = DEFAULT_SHORT_DEGREE_LENGTH;
 }
 canvas.drawLine(getWidth()/2, Math.abs(getWidth()/2 - getHeight()/2), getWidth()/2, Math.abs(getWidth()/2 - getHeight()/2) + degreeLength, paintDegree);
 canvas.rotate(360/60, getWidth()/2, getHeight()/2);
}

3、画刻度上的数字


//刻度数字
int degressNumberSize = 30;
canvas.translate(getWidth() / 2, getHeight() / 2);
Paint paintDegreeNumber = new Paint();
paintDegreeNumber.setTextAlign(Paint.Align.CENTER);
paintDegreeNumber.setTextSize(degressNumberSize);
paintDegreeNumber.setFakeBoldText(true);
for(int i=0;i<12;i++){
 float[] temp = calculatePoint((i+1)*30, r - DEFAULT_LONG_DEGREE_LENGTH - degressNumberSize/2 - 15);
 canvas.drawText((i+1)+"", temp[2], temp[3] + degressNumberSize/2-6, paintDegreeNumber);
}

private float[] calculatePoint(float angle, float length){
 float[] points = new float[4];
 if(angle <= 90f){
  points[0] = -(float) Math.sin(angle*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[1] = (float) Math.cos(angle*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[2] = (float) Math.sin(angle*Math.PI/180) * length;
  points[3] = -(float) Math.cos(angle*Math.PI/180) * length;
 }else if(angle <= 180f){
  points[0] = -(float) Math.cos((angle-90)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[1] = -(float) Math.sin((angle-90)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[2] = (float) Math.cos((angle-90)*Math.PI/180) * length;
  points[3] = (float) Math.sin((angle-90)*Math.PI/180) * length;
 }else if(angle <= 270f){
  points[0] = (float) Math.sin((angle-180)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[1] = -(float) Math.cos((angle-180)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[2] = -(float) Math.sin((angle-180)*Math.PI/180) * length;
  points[3] = (float) Math.cos((angle-180)*Math.PI/180) * length;
 }else if(angle <= 360f){
  points[0] = (float) Math.cos((angle-270)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[1] = (float) Math.sin((angle-270)*Math.PI/180) * DEFAULT_POINT_BACK_LENGTH;
  points[2] = -(float) Math.cos((angle-270)*Math.PI/180) * length;
  points[3] = -(float) Math.sin((angle-270)*Math.PI/180) * length;
 }
 return points;
}

4、画指针


//画指针
Paint paintHour = new Paint();
paintHour.setAntiAlias(true);
paintHour.setStrokeWidth(15);
Paint paintMinute = new Paint();
paintMinute.setAntiAlias(true);
paintMinute.setStrokeWidth(10);
Paint paintSecond = new Paint();
paintSecond.setAntiAlias(true);
paintSecond.setStrokeWidth(5);
Calendar now = Calendar.getInstance();
float[] hourPoints = calculatePoint(now.get(Calendar.HOUR_OF_DAY)%12/12f*360, hourPointerLength);
canvas.drawLine(hourPoints[0], hourPoints[1], hourPoints[2], hourPoints[3], paintHour);
float[] minutePoints = calculatePoint(now.get(Calendar.MINUTE)/60f*360, minutePointerLength);
canvas.drawLine(minutePoints[0], minutePoints[1], minutePoints[2], minutePoints[3], paintMinute);
float[] secondPoints = calculatePoint(now.get(Calendar.SECOND)/60f*360, secondPointerLength);
canvas.drawLine(secondPoints[0], secondPoints[1], secondPoints[2], secondPoints[3], paintSecond);

5、画圆心


//画圆心
Paint paintCenter = new Paint();
paintCenter.setColor(Color.WHITE);
canvas.drawCircle(0, 0, 2, paintCenter);
最后只要启动一个无限循环的线程,每隔1秒针重绘一下View就能让指针动起来了
private Thread timeThread = new Thread() {
 @Override
 public void run() {
  try {
   while(true){
    updateHandler.sendEmptyMessage(0);
    Thread.sleep(1000);
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
};
private Handler updateHandler = new Handler() {
 @Override
 public void handleMessage(Message msg) {
  invalidate();
 }
};

以上就是教大家如何利用Android画个时钟的详细步骤代码,希望对大家的学习Android软件编程有所帮助。

您可能感兴趣的文章:Android获取设备CPU核数、时钟频率以及内存大小的方法android实现widget时钟示例分享Android多功能时钟开发案例(实战篇)Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果android高仿小米时钟(使用Camera和Matrix实现3D效果)Android多功能时钟开发案例(基础篇)Android实现简单时钟View的方法Android仿小米时钟效果Android编程基于自定义控件实现时钟功能的方法Android Canvas自定义实现时钟效果


--结束END--

本文标题: Android画个时钟玩玩

本文链接: https://www.lsjlt.com/news/25960.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何玩转css动画
    本篇内容介绍了“如何玩转css动画”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 什么是动画在 CSS...
    99+
    2024-04-02
  • 如何用html5画一个时钟
    本篇内容介绍了“如何用html5画一个时钟”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   1.实现效...
    99+
    2024-04-02
  • 怎么使用html5 canvas画一个时钟
    这篇文章主要介绍“怎么使用html5 canvas画一个时钟”,在日常操作中,相信很多人在怎么使用html5 canvas画一个时钟问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 带你分分钟玩转C语言指针
    目录何为指针数组指针指针数组字符串数组数组指针的sao气操作二级指针函数指针指针函数文件指针总结何为指针 指针这玩意说白了,就是用来存储一个变量地址的东东 如图: (编辑器为vc2...
    99+
    2024-04-02
  • Win10预览版闹钟怎么设置?Win10闹钟最全的玩法
    Windows 从 8 开始有了闹钟应用,在 10 build 9926 中成为 Modern APP(现代应用),在桌面上也能用了。在提供闹钟功能的同时,还有世界时间、计时器、秒表等功能。 1、启动闹钟。 方法一:&l...
    99+
    2023-06-11
    Win10预览版 Win10闹钟 ?Win10 闹钟 预览 Win10
  • 如何使用HTML5实现一个时钟动画
    这篇文章主要为大家展示了“如何使用HTML5实现一个时钟动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用HTML5实现一个时钟动画”这篇文章吧。  ...
    99+
    2024-04-02
  • 五分钟菜鸟学会Python玩转SQL的神器!
    背景其实一开始用的是pymysql,但是发现维护比较麻烦,还存在代码注入的风险,所以就干脆直接用ORM框架。ORM即Object Relational Mapper,可以简单理解为数据库表和Python类之间的映射,通过操作Python类,...
    99+
    2023-05-14
    Python SQL
  • html5怎么绘制时钟动画
    本文小编为大家详细介绍“html5怎么绘制时钟动画”,内容详细,步骤清晰,细节处理妥当,希望这篇“html5怎么绘制时钟动画”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 &l...
    99+
    2024-04-02
  • html5怎么制作时钟动画
    本篇内容介绍了“html5怎么制作时钟动画”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!<canva...
    99+
    2024-04-02
  • win7win8win10 玩游戏哪个更爽更快?
    每次Windows系统升级时大家都会关心新的系统是否会对性能有什么影响,Windows 10这次升级了DirextX 12,早在1月的9926版本上已经得到了支持,理论上现在的DX11显卡都支持DX12,NVIDIA、A...
    99+
    2023-06-13
    win7 win8 win10 游戏
  • Flowable中定时器的玩法详解
    目录1. 流程定义定时激活2. 流程实例定时挂起3. 定时任务执行过程1. 流程定义定时激活 在之前松哥给小伙伴们介绍流程定义的时候,流程都是定义好之后立马就激活了,其实在流程定义的...
    99+
    2022-11-13
    Flowable定时器使用 Flowable定时器
  • win7玩游戏画面定格死机如何解决
    如果您在使用Windows 7时玩游戏时遇到画面定格或死机的问题,以下是一些可能的解决方法: 更新显卡驱动程序:首先,确保您的显...
    99+
    2023-10-20
    win7
  • 哪个云服务器能玩游戏
    目前,IaaS云服务器(IaaS Cloud Platform)是最流行的云计算服务之一,但也有许多公共云提供商提供各种游戏云服务器(Game Cloud Platform)。 以下是一些受欢迎的常见云服务器提供商: Amazon We...
    99+
    2023-10-26
    玩游戏 服务器
  • win10玩游戏画面定格死机如何解决
    这篇文章主要介绍“win10玩游戏画面定格死机如何解决”,在日常操作中,相信很多人在win10玩游戏画面定格死机如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win10玩游戏画面定格死机如何解决”的疑...
    99+
    2023-07-01
  • win11玩游戏画面定格死机如何解决
    遇到游戏画面定格死机的问题,可以尝试以下解决方法:1. 检查硬件问题:确保电脑硬件配置满足游戏的最低要求,如显卡、内存等。如果硬件配...
    99+
    2023-08-22
    win11
  • 阿里云用哪个ECS可以玩DNF
    随着互联网的快速发展,越来越多的游戏爱好者开始选择云服务器来运行游戏。特别是DNF这种需要高性能CPU和GPU的游戏,对于服务器的要求更是严格。那么,使用阿里云的哪个ECS可以玩DNF呢?下面就来详细说明。 一、选择合适的ECS实例首先,我...
    99+
    2023-11-22
    阿里 ECS DNF
  • 玩转PostgreSQL之30个实用SQL语句
    目录引言实用SQL语句一、数据库连接二、赋权操作三、数据库表或者索引四、获取数据大小五、数据库分析六、数据库备份总结引言 PostgreSQL是一款功能非常强大的开源关系型数据库,它支持哈希索引、反向索引、部分索引、Ex...
    99+
    2022-11-18
    SQL语句 玩转PostgreSQL
  • 哪个云服务器能玩游戏的
    目前,市场上有很多云服务器可以供人们使用,以下是一些常见的云服务器类型: Amazon WebServices(AWS):Amazon WebServices是一家云计算提供商,提供多种服务,包括云服务器、负载均衡器和容错服务等。它是A...
    99+
    2023-10-26
    玩游戏 服务器
  • win10系统玩lol时fps很低怎么办
    FPS全称为Frames Per Second,也就是每秒传输帧数。如果我们想要很流畅地玩游戏的话,就需要至少30的fps值。不过,很多玩家在win10系统中玩lol游戏时,就碰到fps很低、不稳定的情况,玩起来非常卡。...
    99+
    2023-05-20
    win10 fps lol
  • 10分钟玩转Python+Selenium自动化测试,快速入门通道!
    最近浏览了很多同学的简历,大部分都有自动化测试,基本都有selenium。但很少有人真正弄清selenium。一个是selenium的提供了很多组件,让人容易上手,然后很多人就没有然后了。二是selenium的更新伴随着工具的合并,很多人压...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作