Android自定义View之刻度尺
阅读本文大概需要 6.6 分钟。
这是我司同事的一篇文章,介绍了我们项目中实际开发中用到的一个自定义View组件,希望对你们能有借鉴作用,可以点击「阅读原文」跳转到作者原博客。
1
背景
项目中之前用的纵向滚轮用于选择身高体重之类的需求,新版设计要求用横向刻度尺控件来实现,效果图,上面的字不在刻度尺范围内,是一个TextView。
自定义控件对于 Android 开发者来说是必备技能,这篇文章就不讲自定义 View 的基础知识了,主要谈谈绘制逻辑。
2
实现
遵循自定义 View 的开发流程,onMeasure() –> onSizeChanged() –> onLayout() –> onDraw()。由于我们要自定义的是 View 而不是 ViewGroup ,所以 onLayout() 就不用实现了。
3
onMeasure() 测量
onMeasure() 用于测量 View 的大小,View 的大小不仅由自身决定,同时也受父控件的影响,为了我们的控件能更好的适应各种情况,一般会自己进行测量。刻度尺 View 左右是满屏的,偷个懒宽度就不适配了,只做高度测试就好了。高度包括长刻度的高度,加上字和底部间距
4
onDraw() 绘制
绘制做了三件事情:
绘制背景色
绘制指示器
绘制刻度
只看下怎么画刻度,难点在于怎么确定刻度的坐标。首先高度的坐标是一样的,刻度指示器是在屏幕正中,指示某个值,那么该刻度值的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之刻度尺相关推荐
- Android自定义View实现方位刻度尺(类似于吃鸡手游)
Android自定义View实现方位刻度尺(类似于吃鸡手游) 先上效果图 gif可能看不清,我下面放几张图片 原理解析 首先,我们应该把看得到的内容从上至下分成三部分:最上面的文字.中间的竖线和最下面 ...
- android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...
前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...
- Android 自定义View合集
http://blog.csdn.net/u011507982/article/details/51199644 自定义控件学习 https://github.com/GcsSloop/Androi ...
- Android自定义View —— TypedArray
在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...
- Android 自定义View —— Canvas
上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- Android自定义View:ViewGroup(三)
自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...
- android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定
概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...
- android代码实现手机加速功能,Android自定义View实现内存清理加速球效果
Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...
- android中仿qq最新版抽屉,Android 自定义View实现抽屉效果
Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...
最新文章
- python 字符串,字符串运算,比较,索引,切片等
- JDBC常用连接写法(包括MySQL、Oracle、Sybase、SQLServer、DB2)
- optee中添加一个中断以及底层代码的相关解读
- 安装 | Visual Studio Community 2015与OpenCV的安装及下载链接
- 李沐等将目标检测绝对精度提升 5%,不牺牲推理速度
- 方法参数修饰符in,out,ref
- xadsafe做暗刷_手把手教你如何去掉网吧广告之PUBWin2015_XADSAFE
- java读写html文件时出现中文乱码问题的解决方法
- TensorFlow2.0(八)--tf.function函数转换
- linux文件系统初识
- 三菱PLC学习方法分享
- 微信小程序修改BUTTON点击态样式
- C/C++ 模拟键盘操作(一)
- 级联选择器实现省市区三级联动
- 自媒体短视频怎么玩?0粉丝也可以变现,5种变现模式
- 回顾在江西博微科技工作9个月回顾(吐槽)
- 独立游戏资源宝库,Unity AssetStore上最受欢迎的免费资源
- YesPlayMusic 0.4.0中文版:一款mac用户必备的网易云音乐客户端
- 计算机组成原理(详细)
- 【软件测试基础理论知识】2.软件缺陷、软件缺陷与Bug的区别、PIE模型