原文:[UWP]分享一个基于HSV色轮的调色板应用

1. 前言

上一篇文章介绍了HSV色轮,这次分享一个基于HSV色轮的调色板应用,应用地址:ColorfulBox - Microsoft Store

2. 功能

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

2.1 HSV色轮

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

public class ColorPoint : DependencyObject, INotifyPropertyChanged
{public event EventHandler<PropertyEventArgs> 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;/// <summary>/// 获取或设置 Color 的值/// </summary>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中的关键函数感到陌生。

<Style TargetType="local:HsvWheelColorPalette"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:HsvWheelColorPalette"><Grid Background="{TemplateBinding Background}"><Image Source="ms-appx:///Assets/Wheel.png" /><ItemsPresenter /></Grid></ControlTemplate></Setter.Value></Setter><Setter Property="ItemContainerStyle"
            Value="{StaticResource HsvWheelColorPointVisualStyle}" /><Setter Property="ItemsPanel"><Setter.Value><ItemsPanelTemplate><Grid /></ItemsPanelTemplate></Setter.Value></Setter>
</Style>

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:

<TransformGroup><TranslateTransform X="{Binding TranslateX, Source={StaticResource SaturationAndRadiusToTransformXBridge}}" /><RotateTransform Angle="{Binding Color, Converter={StaticResource ColorToAngleConverter}}" />
</TransformGroup>

2.2 后续功能

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

2.3 已知的问题

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

3. 结语

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

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

4. 参考

色论 _ 色彩配置 - Adobe Color CC
操作事件

5. 源码

Colorful-Box

[UWP]分享一个基于HSV色轮的调色板应用相关推荐

  1. [UWP]使用Writeable?Bitmap创建HSV色轮

    原文:[UWP]使用Writeable?Bitmap创建HSV色轮 1. HSV 1.1 HSV的定义 HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法,这种表示法试图做到比RGB基于笛卡尔 ...

  2. 分享一个基于 Spring Boot 的在线教育平台系统

    今天给大家开源一个基于springboot的在线教育平台系统,系统是小孟开发的,第一个版本是小锋开发的.该系统完全免费.白嫖.系统完美运行.具体的介绍如下所示. 1. 技术介绍 核心技术:Spring ...

  3. 分享一个基于 ABP(.NET 5.0) + vue-element-admin 管理后台

    1.前言 分享一个基于ABP(.NET 5.0) + vue-element-admin项目.希望可以降低新手对于ABP框架的学习成本,感兴趣的同学可以下载项目启动运行一下.对于想选型采用ABP框架的 ...

  4. 分享一个基于Vue3+TS构建Cesium组件库

    分享一个基于Vue3+TS构建Cesium组件库 点击进入 Vue Cesium官网 //vc-navigation <template><el-row ref="view ...

  5. 分享一个基于.NET6包含DDD,ES,CQRS等概念的开源项目

    当你在学习DDD.CQRS或时间溯源时,除了大量的学习资源(比如书籍和文章)之外,你还接触到了许多概念,这些资源只是在讨论理论问题.这很好,我们知道他们在说什么,但我们如何在一个真正的项目中使用他们呢 ...

  6. 安信可分享 | 分享一个基于airkiss协议的配网小程序,实现小程序一键配网安信可ESP32C3\ESP8266\ESP32\ESP32S2系列的模组。(附带源码)

    文章目录 一.关于 WeChatAirkiss 1.1 应用场景 二.airkiss 简介 三.开始使用 四.API说明 五.FAQ 六.开源微信物联网控制一览表 联系我们 一.关于 WeChatAi ...

  7. html页面发送微信朋友圈,【源码分享】分享一个基于官方share.html简化的分享js代码(微信,朋友圈,QQ)...

    基于官方demo中的share.hml中的分享内容或者链接到微博,微信,QQ,自己简化了一个通用的分享方法,进一步减少分享功能的开发量. 代码附件中,由于不能上传html文件,所以把文件扩展名改成了d ...

  8. 一个mapper接口有多个mapper.xml 文件_爱了!分享一个基于Spring Boot的API、RESTful API项目种子(骨架)!...

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! 1.☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 2.☞ <Jav ...

  9. 毕设分享:基于STM32两轮自平衡小车 含源码、原理图及PCB文件

    love421个人博客地址:https://love421.github.io 一.硬件介绍 主控芯片用的是100脚的STM32F103VET6,陀螺仪用的是MPU6050,电机驱动用的是TB6612 ...

最新文章

  1. shell中字符串截取的几种方法
  2. 高性能WEB开发(6) - web性能测试工具推荐
  3. oracle的视图表,oracle 常用视图和表
  4. win7下oracle10g安装,专门针对win7下oracle10g安装的详解
  5. mysql 链式查询_MySQL的链接查询
  6. Redis(四):String字符串数据类型详解
  7. javascript闭包新认识
  8. java中使用阻塞队列实现生产这与消费这之间的关系
  9. Unity3D研究院之2D游戏开发制作原理(二十一) 【转】
  10. lammps教程:晶体建模之Atomsk方法(1)
  11. 地图投影(一)高斯克吕格投影
  12. 计算机网线接口松动怎么办,家里宽带“罢工”怎么办?中国移动教你五步排障法...
  13. 第一次破解unity3d安卓游戏笔记+IL指令集合
  14. c语言图形界面切换,「分享」C语言如何编写图形界面
  15. python colormap_Python matplotlib的使用并自定义colormap的方法
  16. 数据科学 | 如何解释线性回归的R方
  17. 写了个修改器....生化危机4的(3月8日更新了物品修改)
  18. 关于联想拯救者Y7000/Y7000P电源显示0%的问题及解决办法
  19. RISC-V Debug Introduction
  20. 路边停车系统无线地磁车辆传感器

热门文章

  1. C# - 生成Word文档(包含插入行,表格,图片,合并等)
  2. 清理 yarn 缓存、清理 npm 缓存
  3. B站2020年每周必看热门视频数据盘点!Python数据分析
  4. android实验报告指导书,虚拟现实技术实验报告指导书.doc
  5. 关于表格的增删改!!我必须泄个恨了!!
  6. 双目立体匹配算法SGM步骤拆解
  7. python字典的比较_python中字典的比较
  8. const引用const指针以及constexpr
  9. 在 cocos2d 里面如何使用 Texture Packer 和像素格式来优化 spritesheet
  10. 毕业论文格式范例讲解