Windows.UI.Composition API是可以从任何通用Windows平台应用程序调用的声明性保留模式API,从而可以直接在应用程序中创建合成对象动画效果

Composition API在 10586SDK 中就已经出现,但是在年度更新之后,该SDK变得更加完善,也有了更多样性的功能。今天我们就来谈谈如何在基于 Anniversary SDK 的UWP应用中使用Composition API创建DropShadow效果。

1.首先,假如我们想要为一个Ellipse对象创造DropShadow效果,那么第一步,我们需要先创建一个Canvas对象,这个对象位于Ellipse的“背后”,要被Ellipse遮挡住,比如这样:

<Grid>
<Canvas x:Name="host"/>
<Ellipse x:Name="target"/>
</Grid>

2.使用ElementCompositionPreview.GetElementVisual()方法获得Canvas的Visual,然后得到该Visual的Compositor,其中下面代码中的host是我们在XMAL中创建的Canvas:

            Visual hostvisual = ElementCompositionPreview.GetElementVisual(host);
Compositor compositor = hostvisual.Compositor;

3.现在我们要通过compositor创建一个新的SpriteVisual。SpriteVisual派生于ContainerVisual类,而ContainerVisual类派生于Visual类。相比起ContainerVisual,SpriteVisual类还包含了图像、效果和交换链形式的内容。在我们这篇blog中,我们就是通过这个SpriteVisual来构建DropShadow。创建好SpriteVisual之后,我们还需要使用ElementCompositionPreview.SetElementChildVisual()方法将这个SpriteVisual添加到XMAL的可视化树中:

            SpriteVisual spritevisual = compositor.CreateSpriteVisual();
ElementCompositionPreview.SetElementChildVisual(host, spritevisual);

4.现在开始进入重要部分,开始构建shadow。我们还是需要使用compositor,通过它我们可以创造一个新的DropShadow。这个创造出的DropShadow就是我们需要的shadow啦!我们可以通过设置这个DropShadow的属性来的到我们需要的DropShadow:

            DropShadow dropshadow = compositor.CreateDropShadow();
dropshadow.Color = apptheme.Gary_Color_Brush.Color;
dropshadow.Opacity = 0.5f;
dropshadow.Offset = new System.Numerics.Vector3(0f, 5f, 0f);
dropshadow.Mask = (target as Shape).GetAlphaMask();

这里的这几行要解释一下:Color属性和Opacity属性都不需要怎么介绍了吧,就是代表着这个DropShadow的颜色和不透明度。Offset表示的是阴影的偏移量。这个偏移量是相对于Canvas在UI中的位置来说的,并且Vector3这个类型在上面代码中的构造函数的三个参数都是float类型,因此数值后面要加上f。最下面的Mask属性呢,可以通过ImageTextBlockShape 这三个类各自实现一个称为 GetAlphaMask 的方法,该方法返回一个 CompositionBrush,用于表示带有元素形状的灰度图像。 此 CompositionBrush 可充当复合DropShadow的输入,因此阴影可以反映元素的形状,而不是矩形。 这将为文本、带有 alpha 的图像和形状启用像素完美、基于轮廓的阴影。如果不是这三个类型的对象是不会带有GetAlphaMask()方法的,因此在使用时一定要注意,否则会抛出异常。

5.然后,我们要把这个DropShadow赋值给spritevisual的Shadow属性:

            spritevisual.Shadow = dropshadow;

6.最后,我们要创建一个表达式动画。完成了这一步之后,DropShadow效果就实现啦:

            ExpressionAnimation animation = compositor.CreateExpressionAnimation("hostvisual.Size");
animation.SetReferenceParameter("hostvisual", hostvisual);
spritevisual.StartAnimation("Size", animation);

至此,我们的DropShadow效果就创建完成啦,大家可以自己动手试试~

(UWP开发)基于Windows10 Anniversary SDK创造出位于可视化层的DropShadow的更多相关文章

  1. 基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装

    最近,物联网的概念比较热门,一大批厂商抢着占领物联网的高低,包括有华为物联网.阿里云物联网.腾讯物联网.AWS物联网等等,无法一一列举,一般物联网包含设备侧开发.平台侧开发.应用侧开发,三个部分构成了 ...

  2. [UWP开发]在windows10中设置壁纸~UserProfilePersonalizationSettings

    在之前的wp8.1和wp8中,微软没有公开设置壁纸的API,只有一个设置锁屏的API,但在Windows10中,微软为我们提供了设置壁纸的API:TrySetWallpaperImageAsync,他 ...

  3. 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj

    原文 将 WPF.UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj 写过 .NET Standard 类库或者 .NET Core 程序的 ...

  4. Windows10 UWP开发 - 响应式设计

      Windows10 UWP开发 - 响应式设计 本篇随笔与大家简单讨论一下在开发适配不同分辨率.宽高比的Windows10 Universal App布局时的可行方式与小技巧.经验均从实践中总结, ...

  5. 基于Prism.Windows的UWP开发备忘

    以前做UWP开发都是使用MvvmLight,主要是简单易上手,同时也写了很多MvvmLight的开发系列文章: UWP开发必备以及常用知识点总结 UWP开发之Mvvmlight实践九:基于MVVM的项 ...

  6. Windows10(uwp)开发中的侧滑

    还是在持续的开发一款Windows10的应用中,除了上篇博客讲讲我在Windows10(uwp)开发中遇到的一些坑,其实还有很多不完善的地方,比如(UIElement.Foreground).(Gra ...

  7. [Android Pro] 开发一流的 Android SDK:Fabric SDK 的创建经验

    cp from : https://academy.realm.io/cn/posts/oredev-ty-smith-building-android-sdks-fabric/ Ty Smith T ...

  8. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  9. Win 10 UWP开发系列:设置AppBarButton的图标

    在WP8以前,页面最下面的四个小圆按钮是不支持绑定的,WP8.1 RT之后,系统按钮升级成了AppBarButton,并且支持绑定了.在Win10 UWP开发中,按钮的样式发生了变化,外面的圆圈没有了 ...

随机推荐

  1. Oracle交易流水号问题

    需求:生成交易流水号,每次新增一条记录时都自动加1,且流水号形式为000000001形式的10位数字. 思路:利用序列可以生成自增的流水号,只需要在前面添加N个0即可,同时,由于数字的长度一定,因此可 ...

  2. Collections.unmodifiableMap

    1. Collections.unmodifiableMap 是什么? Java的官方解释: public static <K,V> Map<K,V> unmodifiable ...

  3. SQL Server数据库SP命令祥解

    1.数据库: (1)sp_helpdb:报告有关指定数据库或所有数据库的信息.例:sp_helpdb   --显示所有数据库信息(名称.大小等)例:sp_helpdb Recruitment   -- ...

  4. 操作系统中的P,V操作(转)

    无论是计算机考研.计算机软件水平考试.计算机操作系统期末考试还是其他计算机岗位考试,P.V原语操作都是一个常考点.下面笔者总结了关于P.V操作的一些知识. 信号量是最早出现的用来解决进程同步与互斥问题 ...

  5. Cocos2d-JS/Ajax用Protobuf与NodeJS/Java通信

    原文地址:http://www.iclojure.com/blog/articles/2016/04/29/cocos2d-js-ajax-protobuf-nodejs-java Google的Pr ...

  6. css负边距之详解

    自从1998年CSS2作为推荐以来,表格的使用渐渐退去,成为历史.正因为此,从那以后CSS布局成为了优雅代码的代名词. 对于所有设计师使用过的CSS概念,负边距作为最少讨论到的定位方式要记上一功.这就 ...

  7. Apache commons-configuration setDelimiterParsingDisable不生效的处理

    Apache commons-configuration setDelimiterParsingDisable不生效的处理 项目中有用到commons-configuration,版本1.9. 配置初 ...

  8. ur c题练习

    ur的c果然sxbk啊 ur5:“三个莫比乌斯反演掷地有声"——摘自v(c)f(z)k(y)语录,无删改 ur2:有根树分治裸题,复杂度玄学$O(n\sqrt{n})$. 首先,转化为统计k ...

  9. $.extend()和 $.fn.extend()

    1 $.extend()      jQuery.extend(): Merge the contents of two or moreobjects together into the first ...

  10. PHP中常见错误

    1.Notice: Undefined variable: 变量名 in 注:使用了一个没有被定义的变量 2.Parse error: syntax error, unexpected T_ELSE ...