ColorPicker
一款基于HSV颜色空间的仿Photoshop取色器的Android版颜色拾取器。
github地址:ColorPicker
前言
上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicker的核心自定义控件ColorPickerView。
ColorPickerView
在阅读代码之前,我们先看一下ColorPicker的布局以及一些标注的数值在代码里的变量名称。
阅读一个自定义View的代码,只需记住四步走:构造方法
、onMeasure
、onLayout
、onDraw
构造方法
1 | public ColorPickerView(Context context) { |
可见,前2个构造器最后都调用了第三个构造器。而第三个构造器里的主要内容都在一个名为init()
的方法。
1 | private void init() { |
init
方法里有很多变量,它们的含义如下图所示:
onMeasure
1 | @Override |
测量模式(MeasureSpecMode
)分为EXACTLY
、AT_MOST
、UNSPECIFIED
三种类型。前两种类型可以通过MeasureSpec.getSize(int measureSpec)
获得具体的值;当测量模式为UNSPECIFIED
时,需要我们自己确定自定义View的高宽。这里我设定了一些默认值,使ColorPicker看起来更舒服。
onLayout
这里使用了父类的onLayout方法。
onDraw
绘制ColorPickerView
分为两个部分:饱和度灰度调色板mSatValRect
+色相调色板mHueRect
。
1 | @Override |
开始了解具体绘制细节之前,希望读者已经了解过Shader
(着色器)的相关知识。
绘制饱和度灰度调色板
1 先画一个大矩形,再在上面画我们的饱和度灰度调色板,这样看起来有一个描边的效果。
2 绘制饱和度灰度指示器。根据当前选择的颜色定位到具体的坐标,在这个坐标上做画。先画一个半径为mSVTrackerRadius
、边线粗细为mDensity
的空心大圆,再在上面画一个半径为mSVTrackerRadius-mDensity
、边线粗细为mDensity
的空心小圆。
1 | /** |
绘制色相调色板
1 同理绘制矩形调色板
2 同理绘制空心圆角矩形
1 | /** |
这样一来,整个ColorPickerView的绘制流程就都在这里了。
下一篇主要讲解ColorPickerView初始颜色传入和颜色改变监听相关代码:仿Photoshop取色器ColorPicker(三)