Android_模拟时钟内时针、分针触摸转动
最近实现了android里的一个机能,在activity里面画了一个模拟的时针,然后触摸上面的时针跟分针可以实现调时间的功能。
其实,说起原来来还是挺简单的,但是我花了将近一周的时间才全部实现,有点惭愧。。。
一、在activity里面画一个时钟,有时针跟分针,代码略。
表盘、时针和分针都是imageView,创建一个位图,然后上面盖了分针的imageView,位图旋转一定的角度,这个时候显示的就是时针的角度。
二、给分针添加onTouch事件:
由于imageView是一层盖着一层的,所以我的代码里是分针的imageView在最上面,所以我的触摸事件就全部写在分针上;
基本原理:当我的手指触摸到mImageView_minuteHand的时候,会有个点坐标,根据点的坐标来判断我点的位置,下图是模拟的时钟界面:
我把时钟分为四个象限,0-15分钟为第一象限,15-30分钟为第二象限,30-45分钟为第三象限,45-60分钟为第四象限,分这四块主要是为了下面的计算角度准备的。
0分的时候为0度,以o点为中心,这样一来我手在圆盘里点到某个位置的时候,连接圆心就有一条直线,圆心与0分连接也有一条直线,就可以计算两条直线的夹角了,但是由于圆心与0分连接的直线斜率不存在,所以我用圆心与15分的连线代替,图中红线所示。
计算两条直线的夹角代码:
double k1 = (double)(startY - centerY)/(startX - centerX);
double k2 = (double)(endY - centerY)/(endX - centerX);
double tmpDegree = Math.atan((Math.abs(k1 - k2))/(1 + k1*k2)) / Math.PI * 180 ;
startX与startY为图中的15分所在点,centerX与centerY为图中的中心点o点,endX与endY就是我手指所点的点,接下来就是计算我手指所在的点与圆心的连线和0度的夹角:
if(endY < width/2 && endX > width/2){ //位于第一象限
firstTouchDegree = 90 - tmpDegree;
System.out.println("firstTouchDegree<90..."+ firstTouchDegree);
}else if (endY > width/2 && endX > width/2 ) { //位于第二象限
firstTouchDegree = 90 + tmpDegree;
System.out.println("firstTouchDegree90-180..."+ firstTouchDegree);
}else if (endY > width/2 && endX < width/2 ) { //位于第三象限
firstTouchDegree = 270 - tmpDegree;
System.out.println("firstTouchDegree180-270..."+ firstTouchDegree);
}else if (endX < width/2 && endY < width/2) { //位于第四象限
firstTouchDegree = 180 + 90 + tmpDegree;
System.out.println("firstTouchDegree>270..."+ firstTouchDegree);
}else if (endX == width/2 && endY < width/2) { //位于0分位置
firstTouchDegree = 0.0;
}else if (endX == width/2 && endY > width/2) { //位于30分位置
firstTouchDegree = 180.0;
}
上述代码中的firstTouchDegree是我手指当前点下去的位置与0度的夹角,上面也提到了,我的imageView都是一层层的叠在一起的,所以我只能触摸到最上层的imageView,本例中是mImageView_minuteHand,所以接下来我就是要判断我点的位置是时针还是分针,但是如果时针跟分针重合在一块的话,那么我点这个位置的时候动的肯定就是分针而不是时针。。。
时针和分针的角度一开始是可以确定的,一个圆是360度,所以我一分钟就是6°,一个小时是30°;如果分钟数不为0,那么时针的角度就是hour * 30 + minute * 0.5;
得到了时针和分针的角度以后,就可以判断如果我点的是时针附近,那么我转动我手指位置的时候就让时针旋转,如果位置在分针附近,那么旋转的时候就是分针在旋转。
在图层的最底层是一层scrollView,所以当我检测到onTouchListener的时候,我要让我的父view停止转动:
v.getParent().requestDisallowInterceptTouchEvent(true);
然后就是根据我手指转动的位置来旋转我的图片即可。
PS:本人把时针跟分针的触摸事件都写在一起去了,只是单纯的根据我手指的位置来判断转动哪个指针,而不是给每个指针写定了某个事件,总觉得有些不妥。。。。
Android_模拟时钟内时针、分针触摸转动的更多相关文章
- 【模拟,时针分针秒针两两夹角】【没有跳坑好兴奋】hdu - 5387 (多校#8 1008)
算是最好写的一道题了吧,最近模拟没手感,一次过也是很鸡冻o(* ̄▽ ̄*)o 注意事项都在代码里,没有跳坑也不清楚坑点在哪~ #include<cstdio> #include<cst ...
- 时针分针角度问题c语言解法
#include <stdio.h> //时针一小时走30度 double hour_per_hour_angle = 30.0; //先算出时针和分钟 一分钟内 分别走多少度数 //时针 ...
- Windows下编程--模拟时钟的实现
windows下编程--模拟时钟的实现: 主要可以分为几个步骤: (1) 编写按键事件处理(启动和停止时钟) (2) 编写时钟事件处理,调用显示时钟函数 (3) 编写显示时钟函数,要调用显 ...
- uva 579 ClockHands 几何初接触 求时针与分针的夹角
貌似是第一次接触几何题... 求时针与分针的夹角,这不是小学生的奥数题么.我小时候也想过这问题的. 每过一小时时针走1/12*360=30度,每过一分钟时针走1/60*30=0.5度,分针走1/60* ...
- canvas 模拟时钟
<meta charset="utf-8"> <canvas width="1000" height="1000" id= ...
- 【CSS3】纯CSS代码实现模拟时钟,+js对时功能。
使用CSS3纯代码来实现模拟时钟,及指针动画功能. 在这里主要使用到css3一些基本元素: border-radius:圆角边框,画圆形:表盘 Transform:变换,旋转,扭曲:刻度盘,指针形状 ...
- VC++SDK编程——模拟时钟
#include <Windows.h> #include <tchar.h> #include <math.h> typedef struct Time { in ...
- 练手WPF(一)——模拟时钟与数字时钟的制作(上)
一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...
- Android控件 之 TextClock & AnalogClock(模拟时钟)
TextClock •简介 关于时间的文本显示,Android 提供了 DigitalClock 和 TextClock. DigitalClock是Android第1版本发布,功能很简单,只显示时间 ...
随机推荐
- 编程算法 - 有序双循环链表的插入 代码(C)
有序双循环链表的插入 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 有序双循环链表的插入, 须要找到插入位置, 能够採用, 两个指针, 一个在前, 一 ...
- Keepalived安装工具
装keepalived前,要先检查主机上是否已经安装, ps -ef | grep keepalive 不检查的话.easy把前人装的东西覆盖掉,那么曾经弄的配置文件都没了比較麻烦. 下面都为root ...
- Spring Boot——开发新一代Spring应用
Spring官方网站本身使用Spring框架开发,随着功能以及业务逻辑的日益复杂,应用伴随着大量的XML配置文件以及复杂的Bean依赖关系.随着Spring 3.0的发布,Spring IO团队逐渐开 ...
- NIO框架之MINA源码解析(转)
http://blog.csdn.net/column/details/nio-mina-source.html http://blog.csdn.net/chaofanwei/article/det ...
- Java常用代码段 - 未完待续
记录一些自己写项目常用的代码段. 格式化常用日期格式 Date date = new Date(System.currentTimeMillis()); DateFormat d3 = DateFor ...
- Delphi数组复制(只能使用System单元的Move函数)
const AA : arrary[..] ,,,,) var BB : arrary[..] of byte; begin BB := AA ; {这样是错误的} Move(AA,BB,sizeof ...
- Delphi引用C对象文件
C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...
- 检测用户是否具有administrator权限(OpenThreadToken,OpenProcessToken,GetTokenInformation,AllocateAndInitializeSid和EqualSid)
检测用户是否具有administrator权限const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0 ...
- PHP正则表达式完全手册
原文:PHP正则表达式完全手册 php的正则表达式完全手册 前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感.只要认真去阅读这些资料,加上应用的时候进行 ...
- Android WebView挂马漏洞--各大厂商纷纷落马
本文章由Jack_Jia编写,转载请注明出处. 文章链接: http://blog.csdn.net/jiazhijun/article/details/11131891 作者:Jack_Jia ...