【Win 10 应用开发】UI Composition 札记(二):基本构件

在上一篇中,老周用一个示例,演示了框架视图的创建过程,在本篇中,老周将给大伙伴们说一下 Composition 构建 UI 的一些“零件”。

UI Composition 有一个核心类——对,就是 Compositor 类,它是总生产车间,组成 UI 的各种元素都可以由它来创建,所以,你会看到,它公开了 K 个以 Create 开头的方法。我们在组建 UI 时所用到的各种元素都可以调用这些以 Create 打头的方法来创建。

要让用户在窗口上看到你所构建的 UI 元素,可视化树中至少需要一 Visual 对象。Visual 是一个基类,在组成可视化树时,我们有三种 Visual 可以用。

第一种是 ContainerVisual,它表示一容器,可以向它的 Children 集合中添加子元素,以构建复杂的可视化对象。

第二种是 SpriteVisual,它从 ContainerVisual 类派生,所以也支持添加子元素。Sprite 是“小仙女”的意思,表明这个类不仅仅是个容器,它自身就可以绘制可视化内容,所以这个类用得还是比较多的。它主要公开了 Brush 属性,可以使用各种画刷来绘制内容。比如,单种颜色填充的画刷,渐变画刷,绘制图形的画刷等。

第三种是  LayerVisual,它也是容器元素,它类似于在视图中创建一个图层,并可以在其中继续添加子元素。

 

要呈现多彩灿烂的内容,你需要画刷,因此,UI Compositon 提供各种用途的画刷。

1、单色画刷,只有一种颜色对对定可视化元素进行填充。

2、渐变画刷,可以设置多种颜色过度。

3、Drawing Surface ,这个强大,相当于一块自由画布,你可以在上面画各种东东。你可以画文本,画圆形,画线,画大象,画野鸭子。甚至你可以在上面画一个正在播放的视频。绘制代码是要用C++来写,不过我们可以结合 Win 2D 组件一起用,这个老周后面会绘出例子的。

4、效果画刷。这种画刷主要用来产生一些视觉效果,比如模糊、锐化、颜色叠加、反相等等。

 

有了可视化对象和画刷,我们基本上可以弄出很多东西来。不过,可能大伙伴们会想了,要是能模拟一些真实场景就更佳了。于是,灯光就出场了。灯光就是模拟我们现实世界中的各种光源,比如小灯泡发出的点光,手电筒照射的光,或者照射范围更大的环境光(如白炽灯)等。

1、SpotLight,这种光源有点像手电筒的光,发散出去后会产生一个锥形区域。

2、PointLight,类似于一盏小灯泡,光源是一个点,但它可以向四周照射。

3、DistantLight,这种光有点像汽车的远光灯(晚上开车时别乱开远光啊,会害死人的),也像太阳光。总之,这种光源照射面很大,而且光很强,传播距离远。

4、AmbientLight,这种光就像你家里,房间里安装的白炽灯,或者是新型的节能灯,白白的光,可以照亮整个屋子,即环境光。

老周这么一说,你一定会觉得没意思,都不知道灯光照起来是什么效果。别急,老周后面会给例子的,你会看到效果的。

 

有刷子,有灯泡,有画布,你大概觉得差不多了,可以画出很多大作了。是的,不过,要是你的大作能够动起来,是不是更生动了呢。比如你画了猪八戒,手里拿着个大西瓜,要是能让八戒动起来,尤其是嘴巴,一下一下地啃西瓜皮,那该多好。因此,你还需要动画。

1、关键帧动画。这个应该好懂,就是可以在某个时刻设置一个关键帧,然后关键帧之间会自动以时间为基准产生过度动画。

2、表达式。即使用一个计算公式来生成动画所需要的值。比如你要对可视化元素的不透明度进行动画处理,输入 Opacity * 0.5,表示每次的不透明度变化,最终值都是上一次计算结果的一半,比如,不透明度为 100%,进行动画后变成 50%,再进行一次动画后就成 25% …… 要注意的是,表达式产生的动画是不能控制时间的。

 

以上内容你不必太认真看,就当作常识,大致涉猎一下就 OK 了,后续的博文中,老周会逐个介绍的。接下来,我们要了解一下如何构建 UI 树。

咱们一起来动动手,学习编程一定要动手的(当然,动脑子是必须的),如果你能用脚打字,也可以动脚。

记得老周一一篇中说过的吧,我们要先实现自己的一个视图,即实现 IFrameworkView 接口。

class DemoView : IFrameworkView
{……
}

然后,我们声明几个私有字段。

        Compositor mCompositor = null;CoreWindow mWindow = null;SpriteVisual rootVisual = null;

要组装 UI 构件,我们需要一个 Compositor 类的实例,在这个例子中,我打算用 SpriteVisual 作为 UI 树的根,它既可以用画刷绘制内容,也可以添加子元素,正可谓是一物两用。

接着,进行初始化,此时我们可以实例化 Compositor 对象,或者实例化其他我们需要的东西。注意此时不要组建 UI 树,因为窗口还未初始化,此时建UI树会发生异常。

        public void Initialize(CoreApplicationView applicationView){mCompositor = new Compositor();}

Load方法我们这里没啥要加载的,就留空吧。

        public void Load(string entryPoint){// 留着以后用来养金鱼}

接下来是重点,SetWindow 方法,此时窗口已经可用,所以此时可以组建 UI 树了。

        public void SetWindow(CoreWindow window){mWindow = window;// 创建根元素rootVisual = mCompositor.CreateSpriteVisual();// 这个是重点,必须要有这个 targetCompositionTarget target = mCompositor.CreateTargetForCurrentView();// 指定 UI 根元素target.Root = rootVisual;// 这时候UI元素上是空白的// 为了能看到东西,我们画点东西上去CompositionColorBrush backBrush = mCompositor.CreateColorBrush(Colors.Blue);rootVisual.Brush = backBrush;}

这里有一个很重要的东东,大伙要严重注意。在组建 UI 时,你必须调用 CreateTargetForCurrentView 方法创建一个 CompositionTarget 实例,它直接与当前的应用程序视图关联的,你必须创建一个该实例,然后再把 UI 的根元素赋值给 CompositionTarget 的 Root 属性。Root 属性引用的UI元素就作为整个视图的根。

而且,这个 target 在整个视图的生命周期内,你只能创建一次,如果设置了根元素后,你还调用 CreateTargetForCurrentView 方法的话,你会收到一条 DCOMPOSITION_ERROR_WINDOW_ALREADY_COMPOSED 错误,该错误提醒你,该可视化树已经组装过了,你不能再调用了。

CreateColorBrush 方法创建一个单色填充的画刷,这里我用的是蓝色。

 

在 Run 方法中开启消息循环。

        public void Run(){mWindow.Dispatcher.ProcessEvents(CoreProcessEventsOption.ProcessUntilQuit);}

但是,以上代码漏了一句,所以一旦运行,你只能看到初始屏幕。如下图。

因为你还没有激活当前窗口,故你在 ProcessEvents 之前,要加上这一句。

        public void Run(){mWindow.Activate();
            mWindow.Dispatcher.ProcessEvents(CoreProcessEventsOption.ProcessUntilQuit);}

因为我用 mWindow 字段引用了当前窗口的实例(就是刚刚上面的 SetWindow 方法中),所以我直接调用 Activate 方法。如果你没有用变量存储当前窗口的实例,你还可以这样调用。

 CoreWindow.GetForCurrentThread().Activate();

 

最后,在视图销毁时,打扫一下卫生。

        public void Uninitialize(){rootVisual.Dispose();mCompositor.Dispose();mWindow = null;}

 

视图的逻辑弄完了,再实现一下 IFrameworkViewSource 接口。

    class DemoViewSource : IFrameworkViewSource{public IFrameworkView CreateView(){return new DemoView();}}

别忘了入口点。

    class Program{static void Main(){CoreApplication.Run(new DemoViewSource());}}

 

好,大功告成!按下【F5】键,你满怀信心地看着程序启动。结果傻眼了,FK!怎么一片空白的?

 

咋回事呢?是啊,咋回事呢。再检查一下代码,逻辑都对啊。其实,你之所以看不到东西,是因为可视化元素的大小默认是 0,所以,你要回到 SetWindow 方法,给可视化元素设一个 Size。

        public void SetWindow(CoreWindow window){mWindow = window;// 创建根元素rootVisual = mCompositor.CreateSpriteVisual();rootVisual.Size = new System.Numerics.Vector2(300f, 320f);
           ……}

如果必要,你还可以设置视图对象的偏移量,默认是 0、0、0,即位于窗口的左上角,注意这个坐标是三个值的,即XYZ三个轴,X和Y轴你都懂的,原点在左上角,X轴正方向往右,Y轴正方向往下。至于Z轴嘛,从屏幕里面向外,说白了就是正方向指着你。

可以设置一下偏移量。

        public void SetWindow(CoreWindow window){mWindow = window;// 创建根元素rootVisual = mCompositor.CreateSpriteVisual();rootVisual.Size = new System.Numerics.Vector2(300f, 320f);rootVisual.Offset = new System.Numerics.Vector3(0f, 20f, 5f);
……            }

 

 好了,一切的疑问都解开了。再运行一下,Good,效果出来了。

 

其实,你还可以让它带透明效果的,方法和 XAML 中一样。

        public void SetWindow(CoreWindow window){……rootVisual = mCompositor.CreateSpriteVisual();rootVisual.Size = new System.Numerics.Vector2(300f, 320f);rootVisual.Offset = new System.Numerics.Vector3(0f, 20f, 5f); rootVisual.Opacity = 0.5f;
              ……}

 

再看看效果。

 

 有趣吧,你还可以对它进行旋转的。

 rootVisual.RotationAngleInDegrees = 60f;

RotationAngle 属性设置的旋转角度是弧度角,要用角度进行设置,就用 RotationAngleInDegrees 属性。

 

你不过瘾的话,还可以调整整个三维坐标的方向。

  rootVisual.Orientation = new System.Numerics.Quaternion(-15f, 5f, 2f, 1f);

 

然后就变成这个样子了。

 

 怎么样,有意思吧。本篇就扯到这里,大伙伴只要知道UI元素的组装方法就可以了,至于说那些三维变量如何设置,这个可以网上查资料,或者自己摸索,三维方面的东西还是挺复杂,其实老周也不是很了解,写出来大家交流交流而已。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

禁用内置键盘_如何禁用Windows 10的所有内置广告

禁用内置键盘Windows 10 has a lot of built-in advertising. This isn’t just about the free upgrade offer: Even if you purchase a new PC that comes with a Windows 10 license or spend $200 for a copy of Windows 10 Professional, you’ll see ads in your operati…

震惊!顶着 39.5℃高烧 ,我和这哥俩都聊了些啥?

这是头哥侃码的第271篇原创上周三,我邀请了两位嘉宾进入直播间,即便自己顶着 39.5 度的高烧,还是强打精神与这哥俩聊了俩小时。相信关注我的朋友们都知道,我是头哥侃码的主理人,同时也是上海TGO上海分会董事会成员。赵…

在Windows Mobile模拟器(Emulator)建立网络连接

因为想使用Windows Mobile Emulator进行网络通信程序的测试,所以找方法配置Emulator的网络连接。在网上找了一些文章,很多都说需要安装Virtual PC 2007. 例如下面的文章Enable Network Connection Windows Mobile 6 Emulator 如果需要 Virtual PC 2007 可…

api游戏编程鼠标选择拖动_如何选择合适的游戏鼠标

api游戏编程鼠标选择拖动You don’t need a gaming mouse to play PC games—just about any mouse with two buttons and a wheel will play anything you want it to. But that’s no reason to deny yourself the wonderful variety of gaming mouse designs on the market.…

iOS - 上架的APP 生成二维码下载

1.首先打开苹果App Store商店进入到里面,找到需要打开链接地址的应用程序,例如:百度。2. 在App Store商店里面先点击一下应用程序图标,再按一下…分享按钮。 3. 接着选择分享APP,再点击拷贝链接地址,将应用…

Rsa2加密报错java.security.spec.InvalidKeySpecException的解决办法

最近在和支付宝支付做个对接,Java项目中用到了RSA2进行加解密,在加密过程中遇到了错误: java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence 代码执行到这句…

浅析领域驱动设计

1.概要DDD(Domain-driven design,模型驱动设计)是一种软件设计的指导思想,而非固定的一套公式化开发模板(这样就会导致网络上出现各种基于自己或业务上的理解而产出的DDD落地的实现,会让很想学习的开发者迷…

Delphi实现的透明阴影以及蒙版效果菜单

QQ2010的皮肤控件目前实现了一部分,看到有些软件的菜单,都有阴影,透明等效果,于是开始重新实现菜单控件,QQ2009版的菜单控件,是自己从TComponent继承了完全模拟实现的一个菜单,虽然实现了菜单控…

cortana搜索框_如何在Windows 10任务栏上隐藏Cortana搜索框

cortana搜索框One of the most talked about features in the latest version of Windows 10 was the Cortana personal assistant that is integrated directly into the taskbar. But what if you don’t want to waste all that taskbar space? 最新版本的Windows 10中最受…

Kotlin 基础 - 数据类型

一、Boolean 类型 Boolean 值有两个值,分别为 true 或 false。多数情况下,Kotlin 中的 Boolean 相当于 Java 中的基本类型 boolean,只有在必要的情况下才会装箱成为 Java 中的装箱类型 Boolean。这一切都是交由编译器来完成,我们无…

微软公布Entity Framework 8.0规划

微软.NET团队在博客上公布了有关 Entity Framework Core 8.0(也称为 EF Core 8 或 EF8)的未来规划。EF Core 8 是 EF Core 7 之后的下一个版本,这将是一个长期支持版本;计划于 2023 年 11 月与 .NET 8 同时发布。该公司表示&#…

roku能不能安装软件_如何阻止假期更改Roku主题

roku能不能安装软件Wondering why your Roku looks…different? Roku occasionally changes the background for its millions of users, something they call a “featured theme.” 想知道为什么您的Roku看起来...不同吗? Roku偶尔会改变其数百万用户的背景&…

助力AIoT,雅观科技发布空间智能化操作系统

雷锋网(公众号:雷锋网)消息,3月14日,雅观科技在上海举办了“「AI」悟及物 「柔」生万屋”2019雅观科技新品发布会,发布了空间智能化操作系统Akeeta、空间智能化柔性服务技术中台Matrix,以及基于两者开发的雅观智慧社区…

如何在Windows 10的地图应用程序中获取离线地图

If you know you’re going to be using your PC in a location without an Internet connection, and you need access to maps, you can download maps for specific areas in the “Maps” app in Windows 10 and use them offline. 如果您知道要在没有Internet连接的地方使…

XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证

1. 申请许可证 Citrix XenApp_XenDesktop7.6和XenServer 6.5申请许可证的步骤是一致的,由于之前我已经申请过XenApp_XenDesktop的许可证,本次以XenServer6.5的许可证申请为例。 1.1 在申请试用或购买Citrix产品时,收到相应的邮件&#xff0…

Windows 11的记事本将获得类似浏览器的标签功能

Windows 11已经向全世界的客户推出,自从它问世以来已经收到各种有趣的更新。例如,Windows 11的22H2版本(操作系统的第一个大更新)为文件资源管理器添加了标签,启用了任务栏的拖放支持,以及更多。Windows-11…

译⽂:Top Three Use Cases for Dapr and Kubernetes

有关译者:陈东海(seachen),⽬前就职于腾讯,同时在社区也是⼀名Dapr Member.导语:在SDLC(Software Development Lifecycle软件开发⽣命周期中),绝⼤多数CNCF项⽬都是专注于软件开发的中后期阶段,特别是运维和…

平视相机svo开源项目_什么是平视显示器(HUD),我应该得到一个吗?

平视相机svo开源项目In a world full of augmented reality snowboard goggles and Google Glass, it seems only fair that our cars get to enjoy some of the same treatment. Heads-up displays, or “HUDs” as they’re better known, are a new type of add-on for cons…

react项目打包后路径找不到,项目打开后页面空白的问题

使用 npm install -g create-react-app快速生成项目脚手架打包后出现资源找不到的路径问题: 解决办法:在package.json设置homepage 转载于:https://www.cnblogs.com/lan-cheng/p/10541606.html