最近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. 浅谈Angular如何自定义创建指令@Directive
  2. Covariance and Contravariance in C#的搜索条件
  3. Self20171218_TestNG+Maven+IDEA环境搭建
  4. 使用OpenVINO遇到No name 'IENetwork' in module 'openvino.inference_engine'解决
  5. TFS2012 服务器安装
  6. s111 stark组件
  7. Android 7 soter,微信(com.tencent.mm) - 8.0.0 - 应用 - 酷安
  8. 第 16 章 垃圾回收相关概念
  9. 极简代码(六)—— 返回 0/1 构成的布尔向量
  10. python语句和语法结构
  11. md5加密算法使用流程
  12. QQ群聊天记录统计分析 V0.2
  13. 框架尺寸调整属性NORESIZE
  14. C#项目解决方案管理器中将*.Designer.cs文件放到*.cs文件下
  15. 为啥联通卡显示无服务器,天津联通物联卡显示无服务器
  16. 使用video.js 播放youtube视频——踩坑记1
  17. Cesium自定义编辑多边形
  18. 关于XML解析的常用方式
  19. 分巧克力(二分法,且注意避免边界问题)
  20. Win10正式企业版激活方法

热门文章

  1. 0xCCCCCCCCC的内存不能访问的原因
  2. Python定时爬取上证指数
  3. #游戏unity-VR场景漫游#关于VR以及项目基础
  4. 网线的做法 及 POE的介绍
  5. bert源码之中_run_strip_accents(text)函数解读
  6. 炉石传说无法登录服务器未响应是什么意思,炉石传说:你还在卡大门无法登陆游戏吗?这些方法也许能帮到你...
  7. java执行linux跳板机_跳板机登录服务器脚本及命令制作
  8. Carla:ROS bridge installation for ROS 1
  9. 【智能制造】「人.机.料.法.环」最全面解析
  10. 这些实用的列表,字符串操作你知道吗?