android 横向滚动选择,简单实现自定义横向滚动选择View
今日产品经理让在产品里面加了个横向选择的功能,控件样子大致要求为:
网上找了好久没找到此控件,只能自己动手写了,很适合新手练习自定义View,并贡献给大家,效果如下:
其实很多滚轮控件也只是这个简单控件组合一下就可以了 。
实现思路
这里我偷懒了,没有把上、左、右三个箭头写到控件里面,写进去也简单,不过突然感觉在外面布局,写个方法出来也是蛮帅的。所以今天我们的主角就是中间的可以横向滑动的部分,乍一看就是个 recycleview,不过这里我没有想过要用 recycleview 来实现,不是不可以,是用 recycleview 的话,各种判断、计算偏移量太多了。
而且需求中要求只是文本,无需加载布局,所以为了节省时间就干脆自定义一个名为 HorizontalselectedView 的 View,宽高无需自己计算,只需在 onDraw() 方法里面把每个String 画出来, 然后监听滑动事件或者点击左右箭头的时候,重走onDraw()方法就可以了,难点在于 onDraw 的时候,每个 String 的坐标如何获得。
控件特征
1、中间箭头下面的文字(被选中的文字)颜色和字体和其他的不一样
2、可以横向左右滑动,滑动过程当中,被选中的文字在变化
3、点击左右箭头的时候也可以 实现滚动,从而改变被选中的文字
4、可见区域内,显示的文字数是可以改变的
5、左右滑动的时候有回弹选择效果
根据以上特征,就能得到我们所需要的自定义属性,如下:
在构造方法里面初始化画笔和属性:
重写onDraw()方法
所有的文字里面,被选中的文字是特殊的,他的大小和颜色不一样,所有我们先把他给画出来,关键点在于要测量文本的宽高,代码如下:
下面要做的是就是要遍历集合,把其他的文字给画出来,刚才也提到了,坐标是难点,我们看张图来理一理:
其实最巧妙的是得到图中所标注的一个单元的长度anInt,可见区域的长度除以可见个数就得到了 , 还有就是这个 n,给到数据源的时候,我是让数据源集合的长度除以2的,这个可以理解的。然后遍历集合的时候 就可以根据下面得到x的坐标:x=width/2+anInt*(i-n)-textWidth/2,这里面的 textWidth 我们默认他一样长了,但实际情况中,可能会出现三位数,四位数,三个字,四个字,所以在代码中,我是获得被选中文字左右两面长度的平均值得到的。
接下来就可以在 onDraw() 方法里面遍历了:
这样所得到的效果是把strings平铺在了控件上,其实已经有点样子了,下面就是进行滑动监听了。
触屏监听事件
触屏监听,自然而然就是要复写 onTouchEvent 方法了 , 这里的触屏事件还是比较简单的,先贴上代码:
奇怪的是,在这里面打 log,只有 down事件 触发,move 和 up 事件触发不了,这就要加上一行代码:
setClickable(true);//使可点击
down 的时候记录下 downX 坐标值,然后 move 时根据 scrollX 和 downX 的大小判断向左还是向右
从而当 scrollX -downX 的绝对值刚好等于 anInt 的时候,n 相应的 加1 或者 减一 , 再进行重绘,继而把此时的 scrollX 赋值给 downX;
这就实现了左右滑动,这个时候,整个文本向右或者向左 一个单元一个单元的移动,这显然不是我们要的效果,我们要的是,滑动的过程当中,文本就跟着手势在动,所以这里面肯定需要个偏移量 offSet;
offset = scrollX - downX;
当移动一个单元长度的时候再把 offset 归零就可以了;所以最终每个文本的x坐标为:
这样就基本实现需求了,需要注意的是有几个地方需要加上 n 的大小判断的,不能让他小于0了,或者大于集合长度了,防止越界
对外提供的一些方法
android 横向滚动选择,简单实现自定义横向滚动选择View相关推荐
- Android PC投屏简单尝试- 自定义协议章(Socket+Bitmap)
代码地址 :https://github.com/deepsadness/MediaProjectionDemo 效果预览 投屏效果预览 简单说明: 使用Android MediaProjection ...
- android 数字滚动抽奖_Android TextView自定义数字滚动动画
背景 在开发需求当中,当有总收益.总用户数等数字要显示时,为了更好的给用户提供展示效果,往往会想加入炫酷的数字滚动动画,使呆板平静的数字变得灵活起来,给人一种增值的直观感受. 简介 NumberRol ...
- python选择框_python - 自定义/删除Django选择框空白选项
python - 自定义/删除Django选择框空白选项 我正在使用Django 1.0.2. 我写了一个由Model支持的ModelForm. 此模型有一个ForeignKey,其中blank = ...
- android 球形进度,android仿360手机卫士的自定义波浪球形进度View 滚动痕迹
先看问题效果图: 那个球星水波纹是个自定义view,代码如下 import com.jinsheng.R; import com.jinsheng.util.MyUtil; import androi ...
- android自定义文件选择,关于安卓自定义本地文件选择库的实现
最近想重温一下旧知识,所以写了这一个库. androidx+kotlin 功能有:(1)多线程本地文件扫描 (2)ContentProvider扫描 注意:若使用本地扫描时,出现错误,请看文章:htt ...
- Android PC投屏简单尝试—最终章2
源码地址:https://github.com/deepsadness/AppRemote 上一章中,我们简单实现了PC的投屏功能. 但是还是存在这一些缺陷. 屏幕的尺寸数据是写死的 不能通过PC来对 ...
- Android PC投屏简单尝试—最终章1
回顾之前的几遍文章,我们分别通过RMTP协议和简单的Socket 发送Bitmap图片的Base64编码来完成投屏. 回想这系列文章的想法来源-Vysor,它通过 USB来进行连接的.又看到了 scr ...
- Android PC投屏简单尝试(录屏直播)2—硬解章(MediaCodec+RMTP)
代码地址 :https://github.com/deepsadness/MediaProjectionDemo 想法来源 上一边文章的最后说使用录制的Api进行录屏直播.本来这边文章是预计在5月份完 ...
- Android 仿拼多多可水平滚动RecyclerView,自定义滚动条滚动距离
Android 仿拼多多可水平滚动RecyclerView,自定义滚动条滚动距离 2020年,希望大家一切平安如意,毕竟这是个出人意料的多事之秋. 一.效果图: 二.快速实现: 1.主函数代码: im ...
最新文章
- java打字母小游戏总结与收获,java:打字母小游戏demo
- linux操作命令comm,Linux
- 关于人工智能引擎的最初分析文档
- Android入门(九)| 滚动控件 ListView 与 RecyclerView
- POJ 1321 棋盘问题(回溯)
- hash地址_深入浅出一致性Hash原理
- et200sp模块接线手册_西门子PN/PN耦合器学习应用系列(1)-外观及接线
- 设备树与驱动的关系_9 Linux设备树的原理与应用实例(一)—— 什么是设备树...
- HTML弹窗上下一步,JS实现从网页顶部掉下弹出层效果的方法
- python多线程刷网站流量(含ip代理池文档,可制作成exe文件挂服务器代刷)
- 2000-2019全国各省分品种能源消费量
- 嵌入式linux系统开发教程
- 高版本linux安装gamit,Linux下安装GAMIT10.5
- 机器人协同工作,RobotArt是怎么做到的呢?
- Expected property shorthand报错
- STEINS;GATE ELITE(中文名《命运石之门:精英》)游戏通关流程
- scrapy 爬取大型图片网站(http://5442.com/)
- 深开鸿携手深业健康、家具协会打造智慧康养新模式,推动行业新标建设
- Flask_从入门到放弃?不!!!从入门到入土!!
- 社交电商跟传统电商有什么区别?近来发展得如何?