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版本发布,功能很简单,只显示时间 ...
随机推荐
- Selenium WebDriver java 简单实例
开发环境 JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse: 下载地址:http ...
- asp.net检查验证字符串是否为纯数字方法小结
原文 asp.net检查验证字符串是否为纯数字方法小结 在asp.net中验证字符串是不是为数字我们没有像php中那么多丰富的函数来直接使用,这里我整理了一些比较实例的验证字符串是否为纯数字方法代码 ...
- C中的几组指针
1.二维数组 下面就三种二维数组进行说明. 1: int **Ptr; 2: int *Ptr[ 5 ]; 3: int ( *Ptr )[ 5 ]; 以上三例都是整数的二维数组,都可以用形如 Ptr ...
- poj 2184 Cow Exhibition(背包变形)
这道题目和抢银行那个题目有点儿像,同样涉及到包和物品的转换. 我们将奶牛的两种属性中的一种当作价值,另一种当作花费.把总的价值当作包.然后对于每一头奶牛进行一次01背包的筛选操作就行了. 需要特别注意 ...
- Struts2通过自己定义拦截器实现登录之后跳转到原页面
这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...
- Android L动画入门
Android L带来了许多新特性,其中就包括了大量的动画效果,你可以在自己的应用中使用.本文中我将详解这些动画和如何在应用中使用.本文中的所有代码可以在github上找到. 波纹和强调 现在安卓支持 ...
- SQL基础检测
1.SQL 指的是? Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? SELECT 3.哪条 SQL 语句用于更新数据库中的数据? UPDATE 4 ...
- 深度RAMOS,把操作系统全部安装在内存上
你看下深度RAMOS就知道了 RAMOS+音速启动+绿色软件+云端 很爽 http://www.shenduwin7.com/jiaocheng/52.html
- Lisp的永恒之道 好文
http://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html
- 更改EBSserver域名/IP
more: 341322.1 : How to change the hostname of an Applications Tier using AutoConfig 338003.1 : How ...