最近实现了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_模拟时钟内时针、分针触摸转动的更多相关文章

  1. 【模拟,时针分针秒针两两夹角】【没有跳坑好兴奋】hdu - 5387 (多校#8 1008)

    算是最好写的一道题了吧,最近模拟没手感,一次过也是很鸡冻o(* ̄▽ ̄*)o 注意事项都在代码里,没有跳坑也不清楚坑点在哪~ #include<cstdio> #include<cst ...

  2. 时针分针角度问题c语言解法

    #include <stdio.h> //时针一小时走30度 double hour_per_hour_angle = 30.0; //先算出时针和分钟 一分钟内 分别走多少度数 //时针 ...

  3. Windows下编程--模拟时钟的实现

    windows下编程--模拟时钟的实现: 主要可以分为几个步骤: (1)   编写按键事件处理(启动和停止时钟) (2)   编写时钟事件处理,调用显示时钟函数 (3)   编写显示时钟函数,要调用显 ...

  4. uva 579 ClockHands 几何初接触 求时针与分针的夹角

    貌似是第一次接触几何题... 求时针与分针的夹角,这不是小学生的奥数题么.我小时候也想过这问题的. 每过一小时时针走1/12*360=30度,每过一分钟时针走1/60*30=0.5度,分针走1/60* ...

  5. canvas 模拟时钟

    <meta charset="utf-8"> <canvas width="1000" height="1000" id= ...

  6. 【CSS3】纯CSS代码实现模拟时钟,+js对时功能。

    使用CSS3纯代码来实现模拟时钟,及指针动画功能. 在这里主要使用到css3一些基本元素: border-radius:圆角边框,画圆形:表盘 Transform:变换,旋转,扭曲:刻度盘,指针形状 ...

  7. VC++SDK编程——模拟时钟

    #include <Windows.h> #include <tchar.h> #include <math.h> typedef struct Time { in ...

  8. 练手WPF(一)——模拟时钟与数字时钟的制作(上)

    一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...

  9. Android控件 之 TextClock & AnalogClock(模拟时钟)

    TextClock •简介 关于时间的文本显示,Android 提供了 DigitalClock 和 TextClock. DigitalClock是Android第1版本发布,功能很简单,只显示时间 ...

随机推荐

  1. Selenium WebDriver java 简单实例

    开发环境 JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse: 下载地址:http ...

  2. asp.net检查验证字符串是否为纯数字方法小结

    原文  asp.net检查验证字符串是否为纯数字方法小结 在asp.net中验证字符串是不是为数字我们没有像php中那么多丰富的函数来直接使用,这里我整理了一些比较实例的验证字符串是否为纯数字方法代码 ...

  3. C中的几组指针

    1.二维数组 下面就三种二维数组进行说明. 1: int **Ptr; 2: int *Ptr[ 5 ]; 3: int ( *Ptr )[ 5 ]; 以上三例都是整数的二维数组,都可以用形如 Ptr ...

  4. poj 2184 Cow Exhibition(背包变形)

    这道题目和抢银行那个题目有点儿像,同样涉及到包和物品的转换. 我们将奶牛的两种属性中的一种当作价值,另一种当作花费.把总的价值当作包.然后对于每一头奶牛进行一次01背包的筛选操作就行了. 需要特别注意 ...

  5. Struts2通过自己定义拦截器实现登录之后跳转到原页面

    这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...

  6. Android L动画入门

    Android L带来了许多新特性,其中就包括了大量的动画效果,你可以在自己的应用中使用.本文中我将详解这些动画和如何在应用中使用.本文中的所有代码可以在github上找到. 波纹和强调 现在安卓支持 ...

  7. SQL基础检测

    1.SQL 指的是? Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? SELECT 3.哪条 SQL 语句用于更新数据库中的数据? UPDATE 4 ...

  8. 深度RAMOS,把操作系统全部安装在内存上

     你看下深度RAMOS就知道了  RAMOS+音速启动+绿色软件+云端  很爽 http://www.shenduwin7.com/jiaocheng/52.html

  9. Lisp的永恒之道 好文

    http://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html

  10. 更改EBSserver域名/IP

    more: 341322.1 : How to change the hostname of an Applications Tier using AutoConfig 338003.1 : How  ...