今日产品经理让在产品里面加了个横向选择的功能,控件样子大致要求为:

网上找了好久没找到此控件,只能自己动手写了,很适合新手练习自定义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相关推荐

  1. Android PC投屏简单尝试- 自定义协议章(Socket+Bitmap)

    代码地址 :https://github.com/deepsadness/MediaProjectionDemo 效果预览 投屏效果预览 简单说明: 使用Android MediaProjection ...

  2. android 数字滚动抽奖_Android TextView自定义数字滚动动画

    背景 在开发需求当中,当有总收益.总用户数等数字要显示时,为了更好的给用户提供展示效果,往往会想加入炫酷的数字滚动动画,使呆板平静的数字变得灵活起来,给人一种增值的直观感受. 简介 NumberRol ...

  3. python选择框_python - 自定义/删除Django选择框空白选项

    python - 自定义/删除Django选择框空白选项 我正在使用Django 1.0.2. 我写了一个由Model支持的ModelForm. 此模型有一个ForeignKey,其中blank = ...

  4. android 球形进度,android仿360手机卫士的自定义波浪球形进度View 滚动痕迹

    先看问题效果图: 那个球星水波纹是个自定义view,代码如下 import com.jinsheng.R; import com.jinsheng.util.MyUtil; import androi ...

  5. android自定义文件选择,关于安卓自定义本地文件选择库的实现

    最近想重温一下旧知识,所以写了这一个库. androidx+kotlin 功能有:(1)多线程本地文件扫描 (2)ContentProvider扫描 注意:若使用本地扫描时,出现错误,请看文章:htt ...

  6. Android PC投屏简单尝试—最终章2

    源码地址:https://github.com/deepsadness/AppRemote 上一章中,我们简单实现了PC的投屏功能. 但是还是存在这一些缺陷. 屏幕的尺寸数据是写死的 不能通过PC来对 ...

  7. Android PC投屏简单尝试—最终章1

    回顾之前的几遍文章,我们分别通过RMTP协议和简单的Socket 发送Bitmap图片的Base64编码来完成投屏. 回想这系列文章的想法来源-Vysor,它通过 USB来进行连接的.又看到了 scr ...

  8. Android PC投屏简单尝试(录屏直播)2—硬解章(MediaCodec+RMTP)

    代码地址 :https://github.com/deepsadness/MediaProjectionDemo 想法来源 上一边文章的最后说使用录制的Api进行录屏直播.本来这边文章是预计在5月份完 ...

  9. Android 仿拼多多可水平滚动RecyclerView,自定义滚动条滚动距离

    Android 仿拼多多可水平滚动RecyclerView,自定义滚动条滚动距离 2020年,希望大家一切平安如意,毕竟这是个出人意料的多事之秋. 一.效果图: 二.快速实现: 1.主函数代码: im ...

最新文章

  1. java打字母小游戏总结与收获,java:打字母小游戏demo
  2. linux操作命令comm,Linux
  3. 关于人工智能引擎的最初分析文档
  4. Android入门(九)| 滚动控件 ListView 与 RecyclerView
  5. POJ 1321 棋盘问题(回溯)
  6. hash地址_深入浅出一致性Hash原理
  7. et200sp模块接线手册_西门子PN/PN耦合器学习应用系列(1)-外观及接线
  8. 设备树与驱动的关系_9 Linux设备树的原理与应用实例(一)—— 什么是设备树...
  9. HTML弹窗上下一步,JS实现从网页顶部掉下弹出层效果的方法
  10. python多线程刷网站流量(含ip代理池文档,可制作成exe文件挂服务器代刷)
  11. 2000-2019全国各省分品种能源消费量
  12. 嵌入式linux系统开发教程
  13. 高版本linux安装gamit,Linux下安装GAMIT10.5
  14. 机器人协同工作,RobotArt是怎么做到的呢?
  15. Expected property shorthand报错
  16. STEINS;GATE ELITE(中文名《命运石之门:精英》)游戏通关流程
  17. scrapy 爬取大型图片网站(http://5442.com/)
  18. 深开鸿携手深业健康、家具协会打造智慧康养新模式,推动行业新标建设
  19. Flask_从入门到放弃?不!!!从入门到入土!!
  20. 社交电商跟传统电商有什么区别?近来发展得如何?

热门文章

  1. Android亮屏、熄屏控制
  2. 全志a33核心板方案应用
  3. win10查看程序运行开始时间
  4. HDLbits——procedures
  5. 全球及中国热电离质谱仪行业投资风险预测及发展规划建议报告2022-2028年
  6. Hbase之一月速成:Hbase的JavaAPI操作
  7. java.lang.IllegalStateException异常原因和解决
  8. 网络打印机ip地址怎么设置?
  9. JZOJ5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜
  10. 会计学原理 读书笔记