自定义View:Android 仿 PS 选色板
前言
今天突然发现年前的文章竟然没有写完,略微有点尴尬。今天分享的主题是Android仿PS选色板。
记得我刚开始学习Android的时候,就一直对PS选色板有一种执着,终于在今年找到了理想的解决方案。首先动图镇楼:
正文
我们常用的颜色主要是为ARGB还有RGB,不过这种组合格式想要实现选色板确实有点力不从心。从图上看,我们需要的二维矩阵,横向是饱和度的变化,纵向是明亮度的变化,类似我们电视机的色彩调节模式。ARGB和RGB是基本色的互相填充,想要精确把控颜色的变化还是很难的。
终于某一天我在网上偶然看到了新的颜色组合格式:HSV。
上面的简单介绍了HSV颜色的构成,非常符合选色板的要求,而且Android有系统API帮助我们把颜色在RGB和HSV之间互相转换。
// RGB转HSV
val hsv = FloatArray(3)
Color.HSVToColor(hsv)
hsv[0] // 色相
hsv[1] // 饱和度
hsv[2] // 明度
// HSV转RGB
val color = Color.HSVToColor(hsv)
// HSV转ARGB
val color = Color.HSVToColor(alpha, hsv)
绘制右侧的色相选择条
首先我们绘制右侧的色相选择条,把需要的色相按照均等渐变绘制一下:
private fun initLinearGradient() {positions = FloatArray(colorArray.size)for (i in colorArray.indices) {positions[i] = i * (1f / (colorArray.size - 1))}shader = LinearGradient(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(),colorArray, positions, Shader.TileMode.CLAMP)
}
然后根据onTouchEvent的位置,计算手指按压的位置,到底是什么颜色,我这采取的方案是ArgbEvaluator:
/*** 计算应该当前的颜色值* */private fun calculateCurrentColor(): Int {// 找到两个颜色区间if (progress == 0f) {return colorArray.first()}if (progress >= 1f) {return colorArray.last()}var startColor = 0var endColor = 0var ratio = 0fvar i = positions.size - 1while (i >= 0) {if (progress >= positions[i]) {startColor = colorArray[i]endColor = colorArray[i + 1]ratio = (progress - positions[i]) / (positions[i + 1] - positions[i])break}i--}val argbEvaluator = ArgbEvaluator()return argbEvaluator.evaluate(ratio, startColor, endColor) as Int}
ArgbEvaluator只能计算两个颜色,所以我需要知道手指按压的位置处于哪两个颜色之间,刚才我们绘制渐变色的时候:
positions = FloatArray(colorArray.size)
已经记录了每一个颜色的位置,和手指的y坐标和View高度的比例是对应的,这样就可以具体颜色,不过颜色的格式RGB。
绘制左侧的渐变自定义View
从右侧的色相选择条得到了色相,第一步,把RGB转换为HSV,下面以横向饱和度为例:
Color.colorToHSV(it, hsv)
// 记录色相的饱和度
val temp = hsv[1]
// 保存饱和度为0的颜色
hsv[1] = 0f
val startColor = Color.HSVToColor(hsv)
// 再保存饱和度为1的颜色
hsv[1] = 1f
val endColor = Color.HSVToColor(hsv)
// 恢复之前的颜色
hsv[1] = temp
// 画出饱和度从0到1的渐变色
return LinearGradient(0f, 0f, width.toFloat(), 0f,intArrayOf(startColor, endColor),floatArrayOf(0f, 1f),Shader.TileMode.CLAMP
)
同理可以得到明度从0到1的渐变,然后两种渐变叠加在一起,我们的二维选择器就完成了。
HSV转RGB
接下来的问题是如何返回手指按下的颜色,这个和之前计算色相选择的道理一样,饱和度和明度的范围都是从0到1的,所以我们根据手指的x坐标和y坐标,求出坐标和宽高的比例,就是对应的饱和度的明度:
// 替换颜色饱和度和明度,返回RGB的颜色
private fun calculateCurrentColor(xDown: Float, yDown: Float): Int {val saturation = xDown / widthval brightness = yDown / heighthsv[1] = saturationhsv[2] = 1- brightnessreturn Color.HSVToColor(hsv)
}
总结
其实选择器的核心思想就是RGB颜色和HSV颜色的互相转换,其他的都是逻辑问题。
具体demo请点击:选色板demo Github地址
自定义View:Android 仿 PS 选色板相关推荐
- android自定义颜色选择器,自定义View:Android 仿 PS 选色板
前言 今天突然发现年前的文章竟然没有写完,略微有点尴尬.今天分享的主题是Android仿PS选色板. 记得我刚开始学习Android的时候,就一直对PS选色板有一种执着,终于在今年找到了理想的解决方案 ...
- android 自定义取色器,【Android自定义View】仿Photoshop取色器ColorPicker(二)
ColorPicker 一款仿Photoshop取色器的Android版取色器. 前言 上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicke ...
- Android自定义View之仿QQ运动步数进度效果
文章目录 前言 先看效果图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/6e4ddec17933496ea4830fa08d8ffbe5.png?x-oss-pr ...
- Android自定义view之仿支付宝芝麻信用仪表盘 ---by ccy
自定义view练习 仿支付宝芝麻信用的仪表盘 对比图: 首先是自定义一些属性,可自己再添加,挺基础的,上代码 <?xml version="1.0" encoding=&qu ...
- 自定义xy组 android,Android自定义view之仿支付宝芝麻信用仪表盘示例
自定义view练习 仿支付宝芝麻信用的仪表盘 对比图: 首先是自定义一些属性,可自己再添加,挺基础的,上代码 接着在构造方法里初始化自定义属性和画笔: private void initAttr(At ...
- 自定义View之仿淘宝详情页
自定义View之仿淘宝详情页 转载请标明出处: http://blog.csdn.net/lisdye2/article/details/52353071 本文出自:[Alex_MaHao的博客] 项 ...
- android 自定义view实现仿QQ运动步数进度效果
最近公司在策划一个新的项目,原型还没出来,再说这公司人都要走没了,估计又要找工作了,所以必须要学习,争取每个写个关于自定义view方面的,这样几个月积累下来,也能学习到东西,今天就带来简单的效果,就是 ...
- Android开发自定义View之仿米家APP双色灯控制UI:做一个智能家居产品的简单智能灯UI !(附带Demo)
一. 前言: 兜兜转转,不知不觉做Android开发已经快2年了,上半年一直在搞wifi模块开发,导致不务正业,写个自定义UI还要折腾半天,真是对不起自己的良心了!最近要对接小米开放平台,不小心看到了 ...
- Android自定义View分享——仿网易云音乐留声机效果
写在前面 这是笔者自学习自定义View以来,分享的第五篇效果,之前分享过一篇动态时钟效果的自定义View,如果有兴趣的可以看看: Android自定义View分享--一个时钟 之前的博客笔者一般都会说 ...
- android自定义view(二)-仿华为卡包效果
前段时间产品经理出了一个卡列表展示效果,效果的大致样子是仿照华为门禁卡卡包效果,研究了一下大致效果出来了,但和华为比还有点差距,主要是动画不是很流畅,仅供大家参考指正,有好的优化方式也可以告诉我,大家 ...
最新文章
- 别吵吵内卷了,看看人家虚拟人:连续直播70天都没工资
- Java通过Executors提供四种线程池
- 大牛手把手教你!2021大厂Java面试经历
- 深度学习(十六)基于2-channel network的图片相似度判别
- OpenShift 4 之 GitOps(4)用ArgoCD向Multi-Cluster发布应用
- 华为机试HJ46:截取字符串
- 通过整数索引选择一行熊猫系列/数据框
- CPU-AMD处理器的驱动下载地址
- avalon做的抽奖效果
- [2018.10.15 T1] 或
- GPS数据格式的分析与处理
- spyder替换_Spyder快捷键
- Odoo(Openerp v8)官方模块一览表
- [碎碎念]祝我的董小姐生日快乐~
- 机器学习中的数学原理——随机梯度下降法
- 【建议收藏】机器学习数据预处理(五)——特征选择(内附代码)
- 【GPS仿真】基于matlab GPS信号捕获跟踪定位仿真【含Matlab源码 1960期】
- 人脸服务器如何与门禁系统对接,安全升级!人脸识别门禁终端集门禁考勤访客对讲一步到位...
- 通过ip反查mac地址
- 维天运通通过港交所上市聆讯:线上GTV减少14亿元,毛利率两连降
热门文章
- keil 使用教程 编写第一个led灯程序
- nfc修改饭卡软件下载_NFC卡模拟,从此打卡刷电梯,饭卡工卡各种IC卡都用手机搞定!...
- tftp工具使用说明
- XP 多国语言包 .
- python ichat使用学习记录
- 以前计算机弹玻璃的游戏叫什么,小时候做过的游戏 你还记得多少 是否还有所保留呢...
- 方正伪GBK(字体名称中有GBK且字数不足21003)字体列表及使用注意事项
- 详细User-Agent大全
- jquery ajax 详细教程视频,Ajax+jquery基础与提升2017视频教程
- UnixC的第十三天