专栏名称: 鸿洋
你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识。点击历史消息,查看所有已推送的文章,喜欢可以置顶本公众号。此外,本公众号支持投稿,如果你有原创的文章,希望通过本公众号发布,欢迎投稿。
目录
相关文章推荐
郭霖  ·  Android振动分析:从App层到HAL层 ·  20 小时前  
鸿洋  ·  一波深入的Android 性能优化 ·  昨天  
郭霖  ·  activityGuard:Android ... ·  2 天前  
鸿洋  ·  Android anr排查之sp卡顿 ·  3 天前  
51好读  ›  专栏  ›  鸿洋

Android 仿iOS滚轮选择控件

鸿洋  · 公众号  · android  · 2017-05-11 07:16

正文

每日推荐


上周刚好我在找ndk相关文章的时候,以下几篇文章作者刚好给我投递了稿件,推荐给大家,需要学习JNI相关的不要错过~


上次JNI的推荐文章在Lottie -- 轻松实现动态加载直播礼物动画一文中,可以一起学习~


Android的JNI【实战教程】java和c/c++的那些事

http://blog.csdn.net/github_33304260/article/details/62891137


Android的JNI【实战教程】AS下NDK环境配置及第一个工程

http://blog.csdn.net/github_33304260/article/details/62891083


Android的JNI【实战教程】Java调用C代码

http://blog.csdn.net/github_33304260/article/details/65440561


Android的JNI【实战教程】C调用Java代码

http://blog.csdn.net/github_33304260/article/details/71213921


本文作者


本文由wozuihaole投稿。

wozuihaole的博客地址:

http://blog.csdn.net/wozuihaole


1
概述


最近项目中需要用到类似iOS的滚轮选择控件,在网上找了些资料,自己写了个自定义控件,为了方便自己以后查看就有了这篇博客,当然了,也是为了跟大家分享一下,有什么问题也请在下面给我留言,好了废话不多说了,先上一下效果图。


效果图:




带确定、取消头的效果图:




第二种效果是基于第一种效果的,所以接下来分析思路以及介绍源码我都会只说第一种,不过最后我也会分享源码链接里面有包括第二种的所有源码,有兴趣可以下载下来试试。


源码下载:

http://download.csdn.net/download/wozuihaole/9814166


我用了两种方法来实现第一种效果,我接下来都会介绍,一种是直接用ondraw方法将所有数据都画出来,然后每次滑动根据滑动距离重绘界面来实现的,第二种是继承linearlayout,把内容textview都放到布局中,给他一个scroll用来实现滑动,最后的实现效果差不多,不过我觉得第一种比第二种滑动更流畅,但是第二种比第一种代码更好理解。


1
继承View实现


第一种继承View用ondraw方法画出界面:


思路:


  1. 指定你希望一屏显示的条目个数count;

  2. 根据count指定你的控件高度height;

  3. 根据height得到屏幕中心的y坐标,在中间画出上下两条选中线;

  4. 然后根据数据集合为数据集合中的所有数据设置初始y坐标,根据y坐标判断数据是否显示来决定是否把数据画到屏幕上,并且判断y坐标是否在上下两天选中线中间来决定是否使用选中字体来突出选中项;

  5. 每次滑动的时候改变数据的y坐标,重复4步骤。


思路就是这样,感觉很简单吧,接下来说说主要代码:


1.我们先来画出图上的两条横线(上下两条选中线):



2.画内容,把每个内容的y坐标都先设置成索引乘上单元格高度,然后判断y是否在控件高度内,决定是否显示,判断y是否在两条线中间,决定使用什么字体画出来:


首先设置数据




绘制数据:



3.滑动处理,按下的时候记录按下的时间和downY坐标,手指滑动的时候根据你滑动的距离设置数据的y偏移坐标,调用invalidate()方法重绘界面(这个方法会重复上边的两步),


手指松开的时候分为两种情况一种是正常松开,排除边界条件(已经选中0还向上滑或者已经选中最后一个还向下滑,直接还选中原先的项不作处理),重置数据的y和y的偏移坐标,并且判断选中项的y是否在两条线的正中间,如果不在进行微量调整;


另外一种情况就是短时间快速滑动松开,也就是按下的时间和松开的时间间隔很短但是移动距离很大,这时候就需要我们做滑动缓慢处理,这样才能实现一条一条滑动的效果,否则效果就可能是直接从第一条数据,然后出现最后一条数据,体验很差,处理方式就是分解滑动距离然后开启一个子线程,子线程每次会睡5毫秒然后设置数据y的偏移量移动一个分解单位,直到滑动到指定距离为止。



用到的方法:



上面就是第一种方法了,感觉滑动处理的时候会比较不好理解,不过仔细看看也就明白了。


3
继承LinearLayout使用scroller来实现


第二种继承LinearLayout使用scroller来实现:


思路:


  1. 还是希望显示的条目个数count;

  2. 根据count设置控件高度height;

  3. 把所有的条目都addview,并且把选中项字体调整为选种字体;

  4. 手指滑动的时候根据滑动距离计算出选中项,改变选中项的字体,利用scrollBy来实现滑动;

  5. 手指松开的时候根据滑动距离计算出选中项,改变选中项的字体,利用scroller.startScroll+computeScroll来实现缓慢移动;

  6. 在控件的外层加一个FrameLayout与控件等高,然后在中间加两条横线代表选中线


这种方法的滑动都是用的现成的方法,所以代码感觉简单些,但是我写完的滑动效果没有第一种方法好。思路就是这些,下面看代码:


1.在屏幕上添加数据,把选中项字体改变,滑动到默认选项



2.滑动过程中如何计算出当前选中项



3.手指移动时的滑动方法:



4.手指松开时调用的滑动方法:



好了就是以上这些了,下面是demo源码下载链接,其中MyWheelView控件对应第一幅图,在MainActivity中调用的;HeaderWheelView对应第二幅图,在MainActivityHeader中调用;MyWheelView2是第二种实现方法,在MainActivity2中调用,使用方法就是修改清单配置文件中的启动activity来运行不同效果就行了。


http://download.csdn.net/detail/wozuihaole/9814166

ZZS

无论你是有 Java 基础希望学 Android 开发的程序员,还是想进一步提升能力的 Android 开发者,都可以在这个Udacity & Google 官方参与制作 的课程项目中找到适合自己的成长路径!



*独家硅谷技术课程

*行业领导者设计的实战项目

*一对一学习辅导

*名企颁发学习认证

*毕业直达滴滴面试


如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。


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