Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[UWP]使用CompositionGeometricClip裁剪复杂图形及进行动画

[UWP]使用CompositionGeometricClip裁剪复杂图形及进行动画

作者头像
dino.c
发布于 2019-12-12 07:52:26
发布于 2019-12-12 07:52:26
88500
代码可运行
举报
文章被收录于专栏:dino.c的专栏dino.c的专栏
运行总次数:0
代码可运行

1. UWP中的其它裁剪方案

之前在 这篇文章 里,我介绍了如何使用UIElement.Clip裁剪UIElement的内容,使用代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Canvas>
    <Image Source="Images/Water_lilies.jpg" Width="200" Height="150">
        <Image.Clip>
            <RectangleGeometry Rect="100 75 50 50"/>
        </Image.Clip>
    </Image>
</Canvas>

另一篇文章里 我介绍了如何使用 CanvasActiveLayer 裁剪Win2D内容,使用代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fullSizeGeometry = CanvasGeometry.CreateRectangle(session, 0, 0, width, height);
var textGeometry = CanvasGeometry.CreateText(textLayout);
var finalGeometry = fullSizeGeometry.CombineWith(textGeometry, Matrix3x2.Identity, CanvasGeometryCombine.Exclude);

using (var layer = session.CreateLayer(1, finalGeometry))
{
    //DrawSth
}

这两种方式都有他们的局限:CanvasActiveLayer虽然很灵活,但只能裁剪Win2D的内容,而且代码量不少;而UIElement.Clip虽然使用简单,但只能裁剪矩形区域。而介于他们之间的是使用Visual.Clip的裁剪方案。

2. Visual.Clip和InsetClip、CompositionGeometricClip

Visual.Clip允许用户使用CompositionClip。刚开始继承CompositionClip类的只有 InsetClip,它只能裁剪矩形区域,不能否定某些情况下它还是挺有用的,何况还能进行动画,但比UIElement.Clip还是好不了多少。使用方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var compositor = Window.Current.Compositor;
var visual = ElementCompositionPreview.GetElementVisual(uElement);
var clip = compositor.CreateInsetClip(leftInset, topInset, rightInset, bottomInset);
visual.Clip = clip;

到了1809,Compositor提供了一个新的函数CreateGeometricClip,它可以以CompositionGeometry 为参数创建一个CompositionGeometricClip,这样就可以根据CompositionGeometry裁剪复杂的区域。Compositor提供了CreateEllipseGeometry、CreateLineGeometry、CreatePathGeometry、CreatePathGeometry(CompositionPath)、CreateRectangleGeometry、CreateRoundedRectangleGeometry等一些列创建Geometry的函数,具体使用方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var compositor = Window.Current.Compositor;
var visual = ElementCompositionPreview.GetElementVisual(uElement);

var geometry  = compositor.CreateEllipseGeometry();
geometry.Center = new System.Numerics.Vector2(192, 525);
geometry.Radius = Vector2.Zero;
var clip = compositor.CreateGeometricClip(geometry);

visual.Clip = clip;

上面的代码使用CreateEllipseGeometry创建了一个圆形的Geometry,设置好这个Geometry的中心点和半径,然后用这个圆形裁剪Visual。

3. 创建动画

CompositionApi的一个最大的好处是灵活的动画,例如下面这个用EllipseGeometry制作的动画:

它只是很简单地对Radius进行KeyFrame动画,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var compositor = Window.Current.Compositor;
var animation = compositor.CreateVector2KeyFrameAnimation();

animation.DelayTime = delayTime;
animation.Duration = TimeSpan.FromSeconds(0.7);
animation.InsertKeyFrame(1, new Vector2(600, 600));
ellipseGeometry.StartAnimation(nameof(CompositionEllipseGeometry.Radius), animation);

有趣的是Radius居然是个Vector2属性,所以CompositionEllipseGeometry其实可以创建为椭圆形。

4. 结语

有了CompositionGeometricClip可以在UWP裁剪复杂区域,但只能在1809以后使用。只是裁剪的话,目前看起来没比WPF有多少优势,但加上Composition动画可玩性就强太多了。使用WPF的时候我几乎不敢使用动画,总是需要照顾低端配置,又担心WPF的性能。10年过去了,UWP的性能以及现代化的电脑配置终于可以让我放飞自我了。

5. 参考

Compositor Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

Visual.Clip Property (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

CompositionClip Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

Compositor.CreateInsetClip Method (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

InsetClip Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

Compositor.CreateGeometricClip Method (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

CompositionGeometry Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

CompositionGeometricClip Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

CompositionEllipseGeometry Class (Windows.UI.Composition) - Windows UWP applications _ Microsoft Docs

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[UWP]用Win2D实现镂空文字
后来试玩了Win2D,这次就用Win2D实现文字的镂空效果,配合PointLight做一个内敛不张扬的番茄钟。
dino.c
2019/11/27
7220
[UWP]使用AlphaMaskEffect提升故障艺术动画的性能(顺便介绍怎么使用性能探测器分析UWP程序)
前几天发布了抄抄《CSS 故障艺术》的动画这篇文章,在这篇文章里介绍了如何使用Win2D绘制文字然后配合BlendEffect制作故障艺术的动画。本来打算就这样收手不玩这个动画了,但后来又发现性能不符合理想。明明只是做做Resize动画和用BlendEffect混合,为什么性能会这么差呢?
dino.c
2020/04/02
7550
[UWP]使用Win2D的BorderEffect实现图片的平铺功能
在WPF中只要将ImageSource的TileMode属性设置为Tile即可实现图片的平铺,具体可见WPF的这些文档:
dino.c
2019/11/18
7770
[UWP]使用PointLight并实现动画效果
UWP中的Composition Light是一组可以创建3D光照的API,它明明十分好玩而且强大, 但博客园几乎没有相关文章(用UWP或pointlight做关键字只能找到我自己的文章),这篇文章就 来介绍Composition Lighting的入门知识。
dino.c
2019/11/07
8490
[UWP]使用PointLight并实现动画效果
[UWP]UIElement.Clip虽然残废,但它还可以这样玩
用了很久很久的WPF,但几乎没有主动用过它的Clip属性,我只记得它很灵活,可以裁剪出多种形状。在官方文档复习了一下,大致用法和效果如下:
dino.c
2019/12/02
8880
[UWP]使用CompositionLinearGradientBrush实现渐变画笔并制作动画
CompositionBrush(合成画笔)是操作可视化层时用于绘制 SpriteVisual 区域的画笔。
dino.c
2019/10/24
7910
[UWP]使用CompositionLinearGradientBrush实现渐变画笔并制作动画
dotnet C# 从控制台开始 关联 Win2D 和 WinUI 3 应用
本文将告诉大家如何从最简单的控制台开始搭建,让 Win2D 和 WinUI 3 关联起来,让 Win2D 可以将内容渲染到 WinUI 3 应用上
林德熙
2024/08/25
2540
dotnet C# 从控制台开始 关联 Win2D 和 WinUI 3 应用
[UWP]用Win2D和CompositionAPI实现文字的发光效果,并制作动画
献祭了周末的晚上,成功召唤出了上面的番茄钟。正当我在感慨“不愧是Shadow大人,这难道就是传说中的五彩斑斓的黑?”
dino.c
2019/11/28
1K0
[UWP]使用CompositionAPI的翻转动画
在 使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow) 这篇文章里我介绍了一个包含长阴影的番茄钟,这个番茄钟在状态切换时用到了翻转动画,效果如上所示,还用到了弹簧动画,可以看到翻转后有点回弹。本来打算自己这个动画效果写的,但火火已经写好了这个FlipSide控件,Github地址在这里,这篇文章就介绍下这个控件的部分原理。
dino.c
2019/11/14
8530
[UWP]通过自定义XamlCompositionBrushBase实现图片平铺
我早就想试试自定义XamlCompositionBrushBase,但一直没机会。上一篇文章介绍到使用Win2D的BorderEffect实现图片的平铺功能,原理很简单,但每次都要写这些代码很繁琐,正好就用这个作为例子试试XamlCompositionBrushBase。
dino.c
2019/11/20
7790
[UWP]通过自定义XamlCompositionBrushBase实现图片平铺
[UWP]使用SpringAnimation创建有趣的动画
最近用弹簧动画(SpringAnimation)做了两个番茄钟,关于弹簧动画官方文档已经介绍得够详细了,这篇文章就摘录一些官方文档核心内容。
dino.c
2019/11/12
9610
[UWP]使用SpringAnimation创建有趣的动画
WPF 使用 Composition API 做高性能渲染
在 WPF 中很多小伙伴都会遇到渲染性能的问题,虽然 WPF 的渲染可以甩浏览器渲染几条街,但是还是支持不了游戏级的渲染。在 WPF 使用的 DX 只是优化等级为 9 和 DX 9 差不多的性能,微软在很多开发者的提议开放了现代渲染方法 Composition API 这是 UI 应用的里程碑的技术
林德熙
2019/04/22
2.2K2
WPF 使用 Composition API 做高性能渲染
【荐】牛逼的WPF动画库:XamlFlair
XamlFlair库的目标是简化常见动画的实现,并允许开发人员使用几行Xaml轻松地添加单个或组合的动画集。
沙漠尽头的狼
2021/12/01
2.3K0
【荐】牛逼的WPF动画库:XamlFlair
win10 uwp 渲染原理 DirectComposition 渲染 例子创建工程如何写显示CompositionSurfaceBrush
本文来告诉大家一个新的技术DirectComposition,在 win7 之后(实际上是 vista),微软正在考虑一个新的渲染机制。
林德熙
2018/09/18
2.9K0
win10 uwp 渲染原理 DirectComposition 渲染
            例子创建工程如何写显示CompositionSurfaceBrush
[UWP]使用GetAlphaMask制作阴影
最近常常接触到GetAlphaMask,所以想写这篇文章介绍下GetAlphaMask怎么使用。其实GetAlphaMask的使用场景十分有限,Github上能搜到的内容都是用来配合DropShadow的,所以这篇文章也以介绍DropShadow为主。
dino.c
2019/10/31
8990
[UWP]抄抄《CSS 故障艺术》的动画
上个月看到CSS 故障艺术这篇文章,最近想转换心情于是开始抄它的动画了(顺便为博客园的UWP板块吊命)。CSS的mix-blend-mode好像很好用,这次用UWP中Win2D的BlendEffect模仿它的玩法。
dino.c
2020/03/27
8000
[UWP]抄抄《CSS 故障艺术》的动画
win10 uwp 毛玻璃 Compositor 创建毛玻璃win2D最简单方法
毛玻璃在UWP很简单,不会和WPF那样伤性能。 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃。
林德熙
2018/09/18
1.2K0
win10 uwp 毛玻璃
            Compositor 创建毛玻璃win2D最简单方法
[UWP]使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow)
前几年扁平化设计(Flat Design)十分流行,后来在扁平化的基础上又流行起了长阴影(Long Shadow)。长阴影其实就是扩展了对象的投影,感觉是一种光线照射下的影子,通常采用角度为 45 度的投影,给对象添加了一份立体感。长阴影快速发展为流行的设计趋势,并经常被应用到扁平设计方案的对象。它很适合用在较小的元素上,一时之间几乎应用的图标都加上了长阴影。(不过现在又不流行了)
dino.c
2019/11/04
4780
[UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐
上一篇文章介绍了CompositionLinearGradientBrush的基本用法, 这篇文章再结合BlendEffec介绍一些更复杂的玩法。
dino.c
2019/10/29
5250
[UWP]CompositionLinearGradientBrush加BlendEffect,双倍的快乐
win10 uwp 进度条 WaveProgressControl
昨天看到了有个大神做出好看的进度条样式,于是我就去抄袭他的代码,但是发现看不懂,于是本文主要翻译就是大神说这个控件如何做。
林德熙
2018/09/18
8190
win10 uwp 进度条 WaveProgressControl
推荐阅读
相关推荐
[UWP]用Win2D实现镂空文字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验