[UWP小白日记-10]程序启动屏(ios解锁既视感)
原文:[UWP小白日记-10]程序启动屏(ios解锁既视感)

讲一下

微软爸爸的开发者大会2016又暴了个表达式动画和Windows.UI.Composition的API,好叼的样子。
官方示例库GitHub
目前是懵逼状态,好复杂。脑细胞已经在地府排队了。

(有没有IOS解锁的既视感?)上图的效果是照搬了微软爸爸的代码实现的。示例项目中有一个SurfaceLoader.cs类这玩意完全可以复制到任何项目中使用

提示

当然我这里没有改Package.appxmanifest中SplashScreen图片的背景色,改到和扩展初始屏一致的颜色就没违和感了

这里有个坑爹的问题,在图上的背景色位置多次改颜色编译都不会修改为当前设置的颜色,还是前一次的颜色,得打开Package.appxmanifest在xml中修改,不知道是不是最新的更新导致的,以前没太注意。

不得不吐槽:你说你越更新越回去,简体中文版还在清单中变英文,搞的我都不确定是不是下成英文版了
搞的和以前windows mobile 10 上一样简体中文系统设置一水的英文,

准备

1.需要添加一个内裤:Win2D。
2.把示例中的SurfaceLoader.cs类复制到自己的项目中。

第一步修改过APP.xaml.cs中的OnLaunched方法

 if (rootFrame.Content == null)
{//rootFrame.Navigate(typeof(MainPage), e.Arguments);ExtendedSplashScreen ess = new ExtendedSplashScreen(e.SplashScreen);rootFrame.Content = ess;
}

看名字就知道这个是GIF中出现的大概是橘红色的启动屏,就是原来的启动屏的扩展(我无耻的连名字都照搬了

),
然后新建一个ExtendedSplashScreen.xaml页面,后退CS中的代码如下

        private Rect _splashImageBounds;public ExtendedSplashScreen(SplashScreen ss){this.InitializeComponent();if (ss != null){_splashImageBounds = ss.ImageLocation;}}private void Page_Loaded(object sender, RoutedEventArgs e){//创建MainPageMainPage mainPage = new MainPage(_splashImageBounds);//导航到MainPagevar rootFrame = Window.Current.Content as Frame;if (rootFrame == null){Window.Current.Content = rootFrame = new Frame();}rootFrame.Content = mainPage;}

现在到了MainPage.cs了然后复制示例代码中

MainPage构造函数

    SurfaceLoader.Initialize(ElementCompositionPreview.GetElementVisual(this).Compositor);//显示初始屏幕ShowCustomSplashScreen(imageBounds);

SurfaceLoader.Initialize(ElementCompositionPreview.GetElementVisual(this).Compositor);
这一句必须有,不然下面代码暴异常
CompositionDrawingSurface surface = await SurfaceLoader.LoadFromUri(new Uri("ms-appx:///Assets/SplashScreen.png"));

显示动画

        private async void ShowCustomSplashScreen(Rect imageBounds){Compositor compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;Vector2 windowSize = new Vector2((float)Window.Current.Bounds.Width, (float)Window.Current.Bounds.Height);//1.创建ContainerVisual实例填充背景色和图片;//2.设置中心缩放ContainerVisual cv = compositor.CreateContainerVisual();cv.Size = windowSize;cv.CenterPoint = new Vector3(windowSize.X, windowSize.Y, 0) * 0.5f;ElementCompositionPreview.SetElementChildVisual(this,cv);//创建sprite的背景色为APP的主题色SpriteVisual backgroundSprite = compositor.CreateSpriteVisual();backgroundSprite.Size = windowSize;backgroundSprite.Brush = compositor.CreateColorBrush((Application.Current.Resources["日间主色"] as SolidColorBrush).Color);cv.Children.InsertAtBottom(backgroundSprite);//创建包含初始屏图像的sprite的尺寸和位置CompositionDrawingSurface surface = await SurfaceLoader.LoadFromUri(new Uri("ms-appx:///Assets/SplashScreen.png"));SpriteVisual imageSprite = compositor.CreateSpriteVisual();imageSprite.Brush = compositor.CreateSurfaceBrush(surface);imageSprite.Offset = new Vector3((float)imageBounds.X, (float)imageBounds.Y, 0f);imageSprite.Size = new Vector2((float)imageBounds.Width, (float)imageBounds.Height);cv.Children.InsertAtTop(imageSprite);}

隐藏动画

   private void HideCustomSplashScreen(){ContainerVisual container = (ContainerVisual)ElementCompositionPreview.GetElementChildVisual(this);Compositor compositor = container.Compositor;// 设置缩放和动画const float ScaleFactor = 20f;TimeSpan duration = TimeSpan.FromMilliseconds(1200);LinearEasingFunction linearEase = compositor.CreateLinearEasingFunction();CubicBezierEasingFunction easeInOut = compositor.CreateCubicBezierEasingFunction(new Vector2(.38f, 0f), new Vector2(.45f, 1f));// 创建淡出动画ScalarKeyFrameAnimation fadeOutAnimation = compositor.CreateScalarKeyFrameAnimation();fadeOutAnimation.InsertKeyFrame(1, 0);fadeOutAnimation.Duration = duration;// Grid的动画Vector2KeyFrameAnimation scaleUpGridAnimation = compositor.CreateVector2KeyFrameAnimation();scaleUpGridAnimation.InsertKeyFrame(0.1f, new Vector2(1 / ScaleFactor, 1 / ScaleFactor));scaleUpGridAnimation.InsertKeyFrame(1, new Vector2(1, 1));scaleUpGridAnimation.Duration = duration;// 初始屏动画Vector2KeyFrameAnimation scaleUpSplashAnimation = compositor.CreateVector2KeyFrameAnimation();scaleUpSplashAnimation.InsertKeyFrame(0, new Vector2(1, 1));scaleUpSplashAnimation.InsertKeyFrame(1, new Vector2(ScaleFactor, ScaleFactor));scaleUpSplashAnimation.Duration = duration;// 设置Grid的中心缩放视觉Visual gridVisual = ElementCompositionPreview.GetElementVisual(MainFrame);gridVisual.Size = new Vector2((float)MainFrame.ActualWidth, (float)MainFrame.ActualHeight);gridVisual.CenterPoint = new Vector3(gridVisual.Size.X, gridVisual.Size.Y, 0) * .5f;// 创建一个视觉组,当改组所有视觉执行完后不再显示CompositionScopedBatch batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);container.StartAnimation("Opacity", fadeOutAnimation);container.StartAnimation("Scale.XY", scaleUpSplashAnimation);gridVisual.StartAnimation("Scale.XY", scaleUpGridAnimation);batch.Completed += Batch_Completed;batch.End();}

动画完成

        private void Batch_Completed(object sender, CompositionBatchCompletedEventArgs args){// 动画完成后处理自定义视觉效果ElementCompositionPreview.SetElementChildVisual(this, null);}

mainPage加载完成

private void Page_Loaded(object sender, RoutedEventArgs e){MainFrame.Navigate(typeof(HomePage));HideCustomSplashScreen();}

最后这个叫Widonw UI Dev Labs的示例

SurfaceLoader.cs

哈哈又水了一波

posted on 2018-03-16 10:03 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/8578876.html

[UWP小白日记-10]程序启动屏(ios解锁既视感)相关推荐

  1. [UWP小白日记-3]记账项目-1

    原文:[UWP小白日记-3]记账项目-1 学了一段时间的UWP,来个项目试试手. 本来是想边做边学MVVMLight的结果感觉MVVM对于萌新来说太高难,以后再把这个项目改造成MVVMLight框架的 ...

  2. [UWP小白日记-5]转换MVA学院的XML字幕为SRT

    原文:[UWP小白日记-5]转换MVA学院的XML字幕为SRT 开源地址:第二版开源地址GIT 暂时用不了了,在最新的WIN10 10586.494系统上回闪退,正在酝酿第二版 O(∩_∩)O哈哈~ ...

  3. [UWP小白日记-9]页面跳转过度动画(二)

    [UWP小白日记-9]页面跳转过度动画(二) 原文:[UWP小白日记-9]页面跳转过度动画(二) 又打算动手写了 [UWP小白日记-6]页面跳转过度动画 上次写的,这次随着学习的进度使用新的玩法. 最 ...

  4. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...

  5. [UWP小白日记-1]判断APP是否是第一次运行初始化SQLITE数据库

    利用应用程序设置来实现此功能. 1.首先,获取APP设置的容器: ApplicationDataContainer localSettings = ApplicationData.Current.Lo ...

  6. 微信小程序视频组件ios端出现视屏区域黑屏

    微信小程序中自定义组件video在ios端会出现从展示页面切到另一个页面上再回到展示页面时会黑屏的情况. 解决思路:在app.js中获取手机类型并定义isApple的全局变量  ->   在vi ...

  7. [UWP小白日记-14]正则表达式

    匹配2位浮点数:  ^(([1-9]+[0-9]*\.{1}[0-9]{1,2})|([0]\.{1}[1-9]+[0-9]{1,2})|([0]\.\d{1,2})|([1-9][0-9]{1,2} ...

  8. iOS开发UI篇 程序启动原理和UIApplication

    2019独角兽企业重金招聘Python工程师标准>>> 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplicati ...

  9. iOS程序启动原理---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

最新文章

  1. Bags of Binary Words | 词袋模型解析
  2. Jenkins+Pipeline+Docker部署SpringBoot项目到远程服务器
  3. MapReduce+Docker:Archer简化Netflix媒体处理
  4. koa --- seesion实现登录鉴权
  5. 前端技术周刊 2018-12-03:DOM
  6. [转]撞车之后,不要傻里傻气的!这里有绝招!
  7. java outer关键字_java中的关键字
  8. pdf2swf font2swf avi2swf
  9. 测井曲线fft matlab,Matlab编程实现FFT实践及频谱分析
  10. ai可以滚轮缩放吗_Illustrator CC for MAC按住alt键滑动鼠标无法缩放?
  11. Ant Design Vue 表格行内编辑!!!
  12. clouder manager卸载
  13. R语言使用t.test函数执行t检验验证总体均值是否是某个特定的值(从样本集推论总体均值)
  14. Java云同桌学习系列(二十二)——mongoDB数据库
  15. 【大学生软件测试基础】图书阅读指南 - 决策表法
  16. 地图商户搜索导出小程序(电脑+手机工具)
  17. vivo Y76s参数配置
  18. 我的世界服务器修改npc指令,我的世界自定义npc指令 | 手游网游页游攻略大全
  19. 加薪不如发奖金? 穆穆-movno1
  20. 原生js获取元素的子元素

热门文章

  1. wp 删除独立存储空间文件(多级非空文件夹删除)
  2. java 8 lambda reduce_JDK8新特性Lambda表达式体验
  3. OpenCV+python:图像二值化
  4. java 自定义注解 解析_java自定义注解
  5. python拟合求参_机器学习作业(四)神经网络参数的拟合——Python(numpy)实现
  6. java的对象是什么意思_Java中对象和对象引用的区别,引用、指向是什么意思
  7. mysql数据库增删改实例_Mysql1:数据库表操作,增删改查举例
  8. cxgrid中纵横单元格合并_被合并单元格折磨疯的我,真后悔没早点知道这个Excel技巧!...
  9. 获取this_小程序获取微信运动步数并集成echarts报表显示
  10. html溢出攻击,溢出(漏洞)攻击的实现及防御