最近UI同学出了一种新的交互, 通过调节刻度尺来调节温度的变化。

通常大家都会想到通过自定义View来实现这个刻度尺。今天我们通过RecyclerView来实现。

1 思考

通过观察, 整个刻度是一个横向排列的列表, 完全可以通过横向的RecyclerView来实现, 指示部分不动,可以固定在RecyclerView的中间部分。通过滑动RecyclerView,来改变刻度值。 看一下实现效果。

2 实现

首先写布局, 在屏幕中央实现一个横向的 RecyclerView的列表, 然后在RecyclerView中央放一个指示针

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/scaleRv"android:layout_width="300dp"android:layout_height="40dp"android:layout_centerInParent="true"android:orientation="horizontal"android:overScrollMode="never" /><Viewandroid:layout_width="3dp"android:layout_height="50dp"android:layout_centerInParent="true"android:background="#FF2C2F" /></RelativeLayout>

为RecyclerView设置Adapter 实现横向刻度

是不是有点刻度尺的感觉了? 接下来我们一步一步完善我们的刻度尺

1 起始位置

可以看出, 刻度占满了整个RecyclerView,导致指示针不能指示到第0个位置和最后一个位置。 我们可以给横向RecyclerView添加Header和Footer, Header的宽度可以设置为RecyclerView宽度的一半, 让刻度尺的第一个刻度, 和指示灯重合。

给RecyclerView添加Header, 其实就是在RecyclerView第0个位置添加一个 Header 类型的 View Hoder。 我们要在RecyclerView 的第0个位置添加一个颜色透明的Header。

header xml:

<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#00000000"></View>

为方便实现, 使用 MultiType实现Header的ViewHolder 样式, 也可以使用原生原生Adapter 实现多类型 ViewHodler。

class EmptyViewBinder : ItemViewBinder<Empty, EmptyViewBinder.EmptyViewHolder>() {class EmptyViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {var emptyView: Viewinit {emptyView = rootView}fun render(item: Empty) {if (emptyView.layoutParams is RecyclerView.LayoutParams) {val params = emptyView.layoutParamsparams.width = item.width // recyclerView 一半的宽度params.height = item.heightemptyView.layoutParams = params}}}override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): EmptyViewHolder {return EmptyViewHolder(inflater.inflate(R.layout.item_empty, parent, false))}override fun onBindViewHolder(holder: EmptyViewHolder, item: Empty) {holder.render(item)}
}

2 滑动对齐

目前的滑动并没有刻度自动对齐指示针的操作, 可以滑动在两个刻度中间的任何位置, 不能确定当前的指示数值。

我们可以通过添加SnapHelper来保证RecyclerView滑动到两个刻度之间时,那个刻度线靠近指示灯, 那个刻度线自动对齐指示线。

 val snapHelper = LinearSnapHelper()snapHelper.attachToRecyclerView(recyclerView)

可以看出有了自动会弹的效果

3 滑动位置暴露

在刻度尺的滑动过程中, 具体还是要获取到刻度滑动的位置。

 recyclerView?.addOnScrollListener(object: RecyclerView.OnScrollListener() {override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {if (RecyclerView.SCROLL_STATE_IDLE == newState) {val childView = snapHelper.findSnapView(layoutManager)childView?.apply {val position = recyclerView.getChildAdapterPosition(this)val scrollScale = (adapter?.items?.get(position) as? Scale)?.scaletextView?.text = "当前滑动到 $scrollScale"}}}})

效果为:

4 扩展

如何方便的扩展那? 假如我们要在两个整数刻度尺之间,添加小数的刻度, 该如何操作那?

既然是RecyclerView 实现的刻度尺, 新增一种刻度就是新增一种ViewHolder,这样实现事情就变得简单起来。

class ScaleHalfViewBinder : ItemViewBinder<ScaleHalf, ScaleHalfViewBinder.Holder>() {class Holder(rootView: View) : RecyclerView.ViewHolder(rootView) {}override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): Holder {return ScaleHalfViewBinder.Holder(inflater.inflate(R.layout.item_scale_half, parent, false))}override fun onBindViewHolder(holder: Holder, item: ScaleHalf) {}
}

可以看出, 还是很方便的实现刻度尺的扩展

文末

我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。

需要的直接点击文末小卡片可以领取哦!我免费分享给你,以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持,需要的自己领取)

Android学习PDF+架构视频+面试文档+源码笔记

部分资料一览:

  • 330页PDF Android学习核心笔记(内含8大板块)

  • Android学习的系统对应视频

  • Android进阶的系统对应学习资料

  • Android BAT大厂面试题(有解析)

领取地址:

Android 刻度尺的另类实现方式.相关推荐

  1. Android登录拦截器实现方式(一)

    Android登录拦截器实现方式(一) 2015-08-04 22:12:01 标签:Android登录 拦截器 Interceptor 对于App端来说,如果能保证用户在登录后能自动延续登录前的操作 ...

  2. Xamarin.Android编译CPU类型选择方式

    Xamarin.Android编译CPU类型选择方式 在Xamarin.Android编译的时候,默认提供了5种CPU类型供大家选择.它们分别为armeabi.armeabi-v7a.arm64-v8 ...

  3. android 定位的几种方式介绍

    [地理位置] android 定位的几种方式介绍 开发中对于地图及地理位置的定位是我们经常要用地,地图功能的使用使得我们应用功能更加完善,下面 www.androidkaifa.com 总结了一下网络 ...

  4. android项目两种构建方式的整合(Eclipse/idea和Android Studio)

    android的两种构建方式 目前android主要有两种构建方式,一种基于ant(传统的),另一种是13年Google/IO上新推出基于Gralde的构建(Android Studio).从sdk的 ...

  5. android 输入过滤,Android Studio添加日志过滤方式

    1.点击下方的 Android Monitor 2.点击右侧的选项菜单 3.点击菜单下拉列表中的 Edit Filter Configuration,打开配置界面 4.配置界面说明 第1部分是为这个过 ...

  6. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200 转载于:https://www ...

  7. Android布局文件的布局方式

    Android布局文件的属性值解析说明:   1.android:id [为控件指定相应的ID] 2.android:text [指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xm ...

  8. Android 沉浸式状态栏 实现方式二 ( 更简单 )

    以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 . 相关链接 http://www.apkbus.com/forum.php?mod=vie ...

  9. Android 反射 换一种方式编程

    Android 反射-换一种方式编程 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/59109933 本文出自[赵彦军的博客] 上一 ...

最新文章

  1. HTTP/HTTPS抓包工具-Fiddler
  2. 实用代码-C#之IP地址和整数的互转
  3. 二十二、面试必备:final、finally、finalize有什么不同?
  4. tailf、tail -f、tail -F 指令
  5. Mariadb 二进制半自动安装脚本
  6. Java实现两个递增有序链表合并成一个递增有序链表和两个非递减有序链表合成一个非递增有序链表
  7. linux buffer/cache手动释放
  8. 如何测试WEB应用程序防止SQL注入***
  9. 输出指定个数所有枚举_【一天一大 lee】区间和的个数 (难度:困难) Day20201107
  10. 7-6 逆序的三位数 (10 分)
  11. 巨蟒python全栈开发-第5天 字典集合
  12. 【IoT】BROADBAND POWERLINE COMMUNICATIONS NETWORK DESIGN:宽带电力线通信网络设计
  13. APK安装流程:点击下载应用了解安装的全过程
  14. cnzz.php,CNZZ站长统计代码报错解决方法
  15. linux dnf教程视频,DNF的命令使用教学
  16. mysql auto.cnf_MySQL之my.cnf配置
  17. DH(Diffie-Hellman)算法本元根(原根)求法
  18. HDU 1847 Good Luck in CET-4 Everybody! 尼姆博弈
  19. 无人机编程donekit及通讯(一)
  20. 教你怎样混社会(转)

热门文章

  1. 大泉州汽车网整站程序PHP生成html开源版 V1.1.4
  2. 独家汇总! 全国30家5G产业联盟名单发布!(附情况介绍)
  3. http中Last-Modified 与If-Modified-Since的说明
  4. js 数组去重 的5种方法
  5. 坐了怎么久,傻傻分不清动车和高铁,有哪些区别呢?
  6. 世界五百强的企业网站
  7. Python键盘按键模拟
  8. hp服务器性能下降,MS SQL Server2000 运行在HP刀片服务器上性能下降,如何解决
  9. java执行linux跳板机_跳板机登录服务器脚本及命令制作
  10. 一个日本人眼中的中国企业的法决