博客
关于我
[UWP]分享一个基于HSV色轮的调色板应用
阅读量:413 次
发布时间:2019-03-06

本文共 2667 字,大约阅读时间需要 8 分钟。

1. 前言

介绍了HSV色轮,这次分享一个基于HSV色轮的调色板应用,应用地址:

2. 功能

ColorfulBox是的简单模仿,只实现了最基本的功能,UI也没那么好看,也没用MVVM框架。

2.1 HSV色轮

这个应用最好玩的地方在于分布于HSV色轮上的各个点(ColorPoint)以及可以通过拖动它们改变颜色。ColorPoint的基本结构如下(不是完整代码):

public class ColorPoint : DependencyObject, INotifyPropertyChanged{    public event EventHandler
ColorChanged; public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnColorChanged(Color oldValue, Color newValue) { ColorChanged?.Invoke(this, new PropertyEventArgs(nameof(Color), oldValue, newValue)); } private Color _color; ///
/// 获取或设置 Color 的值 /// public Color Color { get { return _color; } set { if (_color == value) return; var oldValue = _color; _color = value; OnPropertyChanged("Color"); ColorChanged?.Invoke(this, new PropertyEventArgs(nameof(Color), oldValue, _color)); } }}

由于Color是一个struct,UWP没办法监视struct的值改变事件,所以才使用ColorPoint来包装Color及其它功能。

色轮本身是一个ListView,这样比直接继承Control少写很多代码,尤其是SelectedItem相关的代码还挺无趣的。虽然色轮从外表看不出是个ListView,改改ControlTemplate,再配合GetContainerForItemOverride()PrepareContainerForItemOverride(DependencyObject element, object item)两个函数,可以让ListView完全改头换面。熟悉XAML的开发者应该都不会对这两个ItemsControl中的关键函数感到陌生。

protected override DependencyObject GetContainerForItemOverride(){    return new ColorPointVisual();}protected override void PrepareContainerForItemOverride(DependencyObject element, object item){    base.PrepareContainerForItemOverride(element, item);    if (element is ColorPointVisual visual)    {        visual.ManipulationStarted -= OnColorPointVisualDragStarted;        visual.ManipulationStarted += OnColorPointVisualDragStarted;        visual.ManipulationDelta -= OnColorPointVisualDragDelta;        visual.ManipulationDelta += OnColorPointVisualDragDelta;    }    var colorPoint = item as ColorPoint;    colorPoint.ColorChanged -= OnColorChanged;    colorPoint.ColorChanged += OnColorChanged;}

在UWP中拖动的代码变得很简洁,这次直接在PrepareContainerForItemOverride(DependencyObject element, object item)为ColorPointVisual订阅拖动的事件。至于ColorPointVisual的布局,只需要转换Color为HsvColor,再计算距离中心点的角度(Hue)和距离(Saturation)就可以得出,为了不和ListView的代码耦合,尽量使用Binding:

2.2 后续功能

Hsv色轮是整个应用中最有趣的部分,之后只需要按部就班添加各种色彩规则(目前只有Analogous,即类比)和输出的颜色模型。由于开源这个应用的目的是作为一个用于学习的应用,不想添加太多功能让这个项目的代码变得复杂。

2.3 已知的问题

Hsv色轮中各个ColorPoint拖动并不是太平滑,这是因为Hsv颜色只能表示360 * 100 = 36000 种颜色,而Hsv色轮上有πr^2 个像素点,它们之间做不到完全匹配。虽然已经想到解决方案,不过暂时没太大兴致解决。

3. 结语

前面提到ColorfulBox是一个用于学习的应用,不会有太多复杂的技术,暂时连MVVM都不会有。将来添加功能也会很谨慎(主要看心情),希望代码不会膨胀得太夸张吧。

题外话,UWP一直缺少一个ColorPicker控件,而微软将在Fall Update (1709)中提供新的控件,同样基于HSV色轮。等了这么久终于等到了。

4. 参考

5. 源码

转载地址:http://hiyuz.baihongyu.com/

你可能感兴趣的文章
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
查看>>
上周热点回顾(6.3-6.9)
查看>>
上周热点回顾(8.12-8.18)
查看>>
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
查看>>
蹒跚来迟:新版博客后台上线公测
查看>>
[网站公告]11月26日00:00-04:00阿里云RDS升级
查看>>
[网站公告]又拍云API故障造成图片无法上传(已恢复)
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了
查看>>
上周热点回顾(6.9-6.15)
查看>>
上周热点回顾(10.20-10.26)
查看>>
上周热点回顾(2.16-2.22)
查看>>
上周热点回顾(3.2-3.8)
查看>>
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
查看>>
上周热点回顾(7.27-8.2)
查看>>
上周热点回顾(5.9-5.15)
查看>>
上周热点回顾(1.16-1.22)
查看>>
上周热点回顾(1.23-1.29)
查看>>
上周热点回顾(3.20-3.26)
查看>>
云计算之路-阿里云上:14:20-14:55博客后台2台服务器都CPU 100%引发的故障
查看>>
上周热点回顾(6.19-6.25)
查看>>