专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
stormzhang  ·  被裁员就是员工的错了? ·  昨天  
鸿洋  ·  Perfetto 快速上手指南 ·  昨天  
鸿洋  ·  Android 复杂项目崩溃率收敛至0.01%实践 ·  2 天前  
鸿洋  ·  裁员在家如何保持高效学习 ·  5 天前  
51好读  ›  专栏  ›  郭霖

Android抽奖转盘的实现

郭霖  · 公众号  · android  · 2016-09-18 07:31

正文

今日科技快讯


百度日前已经正式从美国加州机动车辆管理局获得了测试自动驾驶汽车的许可。事实上,早在今年四月,百度就宣布在硅谷建立了无人驾驶技术团队,同时计划在今年年底将团队规模扩大到超过100人。该团队目前由机器学习研究人员、软件工程师和硬件工程师组成,涉及机器人、机器视觉和传感器研发领域。此外,百度还在硅谷大量招聘具有汽车行业经验的从业者。




大家早啊,假日过起来就是快呐!考虑到大家可能还在假期状态,今天推送一篇 Nipuream (也是公众号“老司机”了)的投稿,文章只对转盘的核心部分做出了阐述,所以阅读完大概只需要5分钟,感兴趣的朋友可以下载源码试试,毕竟基本上是可以直接拿来用了,同时希望大家能收获自己的幸运~~


Nipuream 的博客地址:

http://blog.csdn.net/yanghuinipurean


序言


最近需要实现一个抽奖的控件,我简单搜索了下,感觉要不很多细节地方没有处理,要么根本就不能用。索性想自己实现个,从千图网搜了下,挑选了个自己比较喜欢的出来,psd打开后效果如下: 




最终实现效果如下:



点击Go按钮自动滚动



随手势滚动


实现的效果还不错,因为是模拟器加录制,画面可能会有些卡顿,真机其实蛮顺畅的,下面简单的讲讲实现的步骤。


实现


绘制


首先第一个我们要它给画出来,但是要注意的就是Android所对应的坐标系的问题。





其中有两个地方需要注意下,第一个 就是画弧的地方 第一个角度是起始角度第二个是弧的角度,并不是结束的角度,所以是 固定值60第二个地方 就是计算具体的 x,y的值 的时候要 根据弧度去计算,不能根据角度。


使用属性动画旋转


如果用 SurfaceView 去进行重绘旋转存在一些问题,比如旋转的角度不好控制,旋转的速度不好控制。但是用属性动画,这个问题就很好解决了。




用动画最重要的就是,如何计算出结束动画后的位置,那么把最终旋转的总角度%360°就得到最后一圈实际旋转的角度,再除以60就得到了到底选择了几个位置,因为一个位置占据60°,这应该不难理解。




但是问题又来了,Android所对应的坐标系,0的位置应该是最底下,而指针的位置是在最上面,所以,我们结合上面的坐标系来看,还需要处理下,如上面的代码所示。


处理手势


触摸事件的处理,最后到底允不允许转盘随手势滑动呢?其实貌似做成这样也就可以了,但是最后还是实现了下,用到了 GestureDetector Scroller 这个类。其实做法有很多,首先获取我们的滑动的距离,Math.sqrt(dx * dx + dy * dy),然后无非就是把这个距离转换成我们需要的角度,你可以把这个距离当作我们的周长来处理,也可以把这个距离当作我们总的旋转的角度来处理。之后就是随着时间的流逝,不断的刷新我们的界面了。




处理剩余问题


还存在个问题,如果没有手势去操作转盘,那我们很容易判断它所旋转的角度,但是有手势的参与,我们很容易旋转到转盘中两个分片中间的位置,那么,我们在让它旋转之前,要简单处理下,避免这种事情发生。


//TODO 为了每次都能旋转到转盘的中间位置
int offRotate = DesRotate % 360 % 60;
DesRotate -= offRotate;
DesRotate += 30;


这样不管手势怎么操作,我最终都是旋转到分片的中间位置了。


代码


代码地址:

https://github.com/Nipuream/LuckPan


apk地址:

https://github.com/Nipuream/LuckPan/raw/master/luck_pan.apk






如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。


欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: