阅读本文大概需要 6.6 分钟。

这是我司同事的一篇文章,介绍了我们项目中实际开发中用到的一个自定义View组件,希望对你们能有借鉴作用,可以点击「阅读原文」跳转到作者原博客。

1

背景

项目中之前用的纵向滚轮用于选择身高体重之类的需求,新版设计要求用横向刻度尺控件来实现,效果图,上面的字不在刻度尺范围内,是一个TextView。

自定义控件对于 Android 开发者来说是必备技能,这篇文章就不讲自定义 View 的基础知识了,主要谈谈绘制逻辑。

2

实现

遵循自定义 View 的开发流程,onMeasure() –> onSizeChanged() –> onLayout() –> onDraw()。由于我们要自定义的是 View 而不是 ViewGroup ,所以 onLayout() 就不用实现了。

3

onMeasure() 测量

onMeasure() 用于测量 View 的大小,View 的大小不仅由自身决定,同时也受父控件的影响,为了我们的控件能更好的适应各种情况,一般会自己进行测量。刻度尺 View 左右是满屏的,偷个懒宽度就不适配了,只做高度测试就好了。高度包括长刻度的高度,加上字和底部间距

4

onDraw() 绘制

绘制做了三件事情:

  1. 绘制背景色

  2. 绘制指示器

  3. 绘制刻度

只看下怎么画刻度,难点在于怎么确定刻度的坐标。首先高度的坐标是一样的,刻度指示器是在屏幕正中,指示某个值,那么该刻度值的x坐标就是确定的。根据这个值去画其他坐标,包括长刻度和短刻度。

首先要确定每个长刻度(和短刻度,如果有的话)的坐标宽度和单位,确定基础单位和基础单位宽度(如果有短刻度以短刻度为基础单位)。那么

第i个刻度x坐标 = 中间刻度x坐标 + i * 基础单位宽度

其中i的取值范围在正负屏幕可绘制多少个基础单位,第0位就是屏幕正中的刻度值。以该值为基础一次画出可以在屏幕中显示的剩余刻度,如果是长刻度单位的整数倍就画长刻度,刻度值只在长刻度下画。
这样就有一个问题,正中刻度值必须是可以整除基础单位,比如,长刻度 = 1,中间两个短刻度,这样基础单位值就是0.5,currentValue = 0.3,那么下一个值就是0.8,但是这样显示并不是我们想要的,我们想要0、0.5、1、1.5这样的值。所以就是在初始化的时候格式化这些值,使得所有可显示的值都可以整除基础单位值,也就是余数为0。
由于使用float计算,所以要用到float精确计算,否则取余操作会出现不等于0的误差导致画不出长刻度。

5

处理滑动操作

滑动处理比较简单,以初始化为基础,每次move操作累加x坐标,以此值绘制偏移量,停止滑动时以基础单位宽度为基准四舍五入,开始动画滑动到相应的刻度值上。
主要方法:

关于刻度的单位,需要给出长刻度单位和中间的短刻度个数,这样中间的短刻度单位就确定了,所以理论上不管中间有几个短刻度计算都是一样的。我在里面封装了三个常用的,2、5、10三种。

支持的 styleable

代码在这里:

https://gist.github.com/w4lle/2f676f0f2005f6a24ca6c122b7e214b4

最后,实现的效果比较单一,主要是面向产品方面的需求,没有做太多的扩展,有时间再完善下。


之前的这篇文章,为了感谢大家对我的生日祝福,我特地为大家准备了福利,在不知道有福利的情况下,你们的对我的赞赏绝对是真心的,我良心张也不是虚的,来看下都有哪些幸运儿:

「李济洲」、「Sure」、「Eason Cui」、「潇洒哥。」、「飞」、「举例说明」、「静女其姝」、「white」、「liufeng#」、「存在」、「warm」、「走着」、「小河马」、「( ̄o ̄) . z Z 」、「楷」、「尹逸良」、「邱拓先」、「a邱振环」、「Agoni」、「落叶」、「一半」、「Baron」、「StormMa」

妈蛋,我也不知道剩下的礼物还够不够,礼物是 100offer 的 Cherry 鼠标垫外带一个小U型颈枕,不够的话我给你发红包代替。另外,快递费自费,还请谅解。至于为什么这些人能中奖,想必他们自己会知道!

最后,有多少人还记得明天是丧心病狂的高考日?想想他们,在想想现在的自己不用高考简直幸福死了。如果现在我们能拿出当年高中十分之一的努力,那还有什么学不会?所以,每当你学不下去的时候,想想自己,当初也是那么的拼命努力,现在为什么就不可以了?

对了,这是我明天的准考证,大家预祝我高考成功吧!

Android自定义View之刻度尺相关推荐

  1. Android自定义View实现方位刻度尺(类似于吃鸡手游)

    Android自定义View实现方位刻度尺(类似于吃鸡手游) 先上效果图 gif可能看不清,我下面放几张图片 原理解析 首先,我们应该把看得到的内容从上至下分成三部分:最上面的文字.中间的竖线和最下面 ...

  2. android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...

    前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...

  3. Android 自定义View合集

    http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习  https://github.com/GcsSloop/Androi ...

  4. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  5. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  6. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  7. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

  8. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定

    概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...

  9. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果

    Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...

  10. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...

最新文章

  1. python 字符串,字符串运算,比较,索引,切片等
  2. JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
  3. optee中添加一个中断以及底层代码的相关解读
  4. 安装 | Visual Studio Community 2015与OpenCV的安装及下载链接
  5. 李沐等将目标检测绝对精度提升 5%,不牺牲推理速度
  6. 方法参数修饰符in,out,ref
  7. xadsafe做暗刷_手把手教你如何去掉网吧广告之PUBWin2015_XADSAFE
  8. java读写html文件时出现中文乱码问题的解决方法
  9. TensorFlow2.0(八)--tf.function函数转换
  10. linux文件系统初识
  11. 三菱PLC学习方法分享
  12. 微信小程序修改BUTTON点击态样式
  13. C/C++ 模拟键盘操作(一)
  14. 级联选择器实现省市区三级联动
  15. 自媒体短视频怎么玩?0粉丝也可以变现,5种变现模式
  16. 回顾在江西博微科技工作9个月回顾(吐槽)
  17. 独立游戏资源宝库,Unity AssetStore上最受欢迎的免费资源
  18. YesPlayMusic 0.4.0中文版:一款mac用户必备的网易云音乐客户端
  19. 计算机组成原理(详细)
  20. 【软件测试基础理论知识】2.软件缺陷、软件缺陷与Bug的区别、PIE模型

热门文章

  1. js a/a中this的使用
  2. poj 1823 Hotel 线段树,注意懒惰标记,不标记就会超时滴
  3. poj 2389 Bull Math java解决!!
  4. poj 1962 Corporative Network 并查集,很容易超时,大家要注意合并
  5. axure rp9是什么软件?如何在Mac中安装使用?
  6. DMG Canvas for mac(DMG打包工具)
  7. mac搜索文件什么都没有,是为什么
  8. 应用华云对象存储服务实现网站存储的平滑迁移实践
  9. 客户端登陆服务器用户名验证
  10. pdflush进程详解