你还在用GIF?那就out了

前言

  • 今天介绍一篇使用json格式在wpf中播放动画效果;

正文

  • 话说在上古(1987)时代,Gif因其体积小成像相对清晰和非常强的兼容性,而大受欢迎;

  • Gif也因为当时的技术限制导致很多缺陷 这包括对电脑的内存和性能占用非常大;

  • 同时Gif还是一个有损文件格式 对半透明和颜色都有一定程度的限制;

  • 随着技术的进步衍生出了 apngwebp格式相对技术色彩范围更广效果也更清晰也占用更低的内存;

  • apngwebp这两种格式需要复杂的开发环境来支持,还是不太友好;

  • 这时就需要另外一种格式了 序列帧

  • 序列帧它是一个无损低内存的格式,不过只能在客户端使用;

  • 因为帧数多想要在web环境中使用 ,就需要转换为雪碧图

  • Lottie动画是由airbnb公司推出的;

  • Lottie的原理是把各种矢量素材以及效果 打包成一个体积很小的json文件然后交给开发人员就好了;

  • 经常在APP所见到的动态图标都是由Lottie来实现的;

  • 下面我们如何开源项目LottieSharp[1]进行展现json文件动画;

1)Nuget 搜索 LottieSharp 点击安装;6a62882f88a0c127b417388906d0c572.png2)使用方式很简单如下

<ws:Window x:Class="LottieSharp.Sample.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:LottieSharp.Sample"xmlns:lottieSharp="clr-namespace:LottieSharp;assembly=LottieSharp"xmlns:ws="https://github.com/WPFDevelopersOrg.WPFDevelopers.Minimal"mc:Ignorable="d"Title="{Binding Path=ImageDrawable.Fps, StringFormat={}LottieSharp:{0}, ElementName=LottieAnimationView}" Height="450" Width="800"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition /></Grid.ColumnDefinitions><Expander  ExpandDirection="Left" Grid.Column="0" Style="{DynamicResource ExpanderStyle1}" IsExpanded="True"><Border  BorderBrush="{StaticResource PrimaryPressedSolidColorBrush}"BorderThickness="0,0,1,0"><ListBox x:Name="myListBox"SelectionChanged="myListBox_SelectionChanged"/></Border></Expander><Grid Grid.Column="1"><Grid.RowDefinitions><RowDefinition Height="*" /><RowDefinition Height="auto" /><RowDefinition Height="auto" /><RowDefinition Height="auto" /><RowDefinition Height="auto" /></Grid.RowDefinitions><lottieSharp:LottieAnimationView x:Name="LottieAnimationView" DefaultCacheStrategy="None" FileName="Assets/moody-dog.json" AutoPlay="True" VerticalAlignment="Center" HorizontalAlignment="Center"/><Slider Grid.Row="1" Maximum="10" Value="1" Minimum="0.1" SmallChange="0.1" LargeChange="0.1" ValueChanged="Slider_ValueChanged_1" /><Slider Grid.Row="2" Minimum="0" Maximum="1000" SmallChange="1" ValueChanged="Slider_ValueChanged" /><DockPanel Grid.Row="3" Margin="5"><Button DockPanel.Dock="Left" Content="Pause Animation" Click="PauseAnimation_Click" HorizontalAlignment="Left" /><Button DockPanel.Dock="Left" Margin="10,0,0,0" Content="Start Animation" Click="StartAnimation_Click" HorizontalAlignment="Left"/><!--<Button DockPanel.Dock="Left" Content="Load Animation" Margin="10,0,0,0" Click="LoadAnimation_Click" HorizontalAlignment="Left"/>--><StackPanel DockPanel.Dock="Right" Orientation="Horizontal"  HorizontalAlignment="Right" Margin="10,0" Width="158"><TextBlock Text="Fps: " FontSize="16" VerticalAlignment="Center"></TextBlock><TextBox Text="{Binding FrameRate, ElementName=LottieAnimationView, Mode=TwoWay}" Width="60"/></StackPanel></DockPanel><Grid Grid.Row="4" Margin="5"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto" /><ColumnDefinition Width="*" /><ColumnDefinition Width="Auto" /><ColumnDefinition Width="Auto" /></Grid.ColumnDefinitions><TextBlock Grid.Column="0" Text="ImageAssetsFolder (optional):" VerticalAlignment="Center"/><TextBox Grid.Column="1" Name="ImageAssetsFolderTextBox" Margin="10,0,0,0" TextChanged="ImageAssetsFolderTextBox_TextChanged"/><Button Grid.Column="2" Margin="10,0,0,0" Content="..." Click="LoadImageAssetsFolder_Click" /><Button Grid.Column="3" Margin="10,0,0,0" Content="X" ToolTip="Delete path" Click="DeleteImageAssetsFolder_Click" /></Grid></Grid></Grid>
</ws:Window>

3)后台逻辑代码;

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Controls;namespace LottieSharp.Sample
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow{public MainWindow(){InitializeComponent();Loaded += MainWindow_Loaded;LottieAnimationView.UseHardwareAcceleration(true);}private void MainWindow_Loaded(object sender, RoutedEventArgs e){var path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets");var root = new DirectoryInfo(path);var array = new List<string>(); foreach (var item in root.GetFiles()){array.Add(item.Name);}myListBox.ItemsSource = array;}protected override void OnClosed(EventArgs e){base.OnClosed(e);LottieAnimationView.Dispose();DataContext = null;}private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e){LottieAnimationView.PauseAnimation();LottieAnimationView.Progress = (float)(e.NewValue / 1000);}private void LoadAnimation_Click(object sender, RoutedEventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.DefaultExt = ".json";openFileDialog.Filter = "Json files|*.json|All files|*.*";if (openFileDialog.ShowDialog() == true){LottieAnimationView.PauseAnimation();LottieAnimationView.FileName = openFileDialog.FileName;LottieAnimationView.PlayAnimation();}}private void StartAnimation_Click(object sender, RoutedEventArgs e){LottieAnimationView.PlayAnimation();}private void PauseAnimation_Click(object sender, RoutedEventArgs e){LottieAnimationView.PauseAnimation();}private void LoadImageAssetsFolder_Click(object sender, RoutedEventArgs e){using (var dialog = new System.Windows.Forms.FolderBrowserDialog()){if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)ImageAssetsFolderTextBox.Text = dialog.SelectedPath;}}private void DeleteImageAssetsFolder_Click(object sender, RoutedEventArgs e){ImageAssetsFolderTextBox.Text = "";}private void ImageAssetsFolderTextBox_TextChanged(object sender, TextChangedEventArgs e){LottieAnimationView.PauseAnimation();LottieAnimationView.ImageAssetsFolder = ImageAssetsFolderTextBox.Text;}private void Slider_ValueChanged_1(object sender, RoutedPropertyChangedEventArgs<double> e){if (!double.IsNaN(e.NewValue))LottieAnimationView.Scale = (float)e.NewValue;}private void myListBox_SelectionChanged(object sender, SelectionChangedEventArgs e){var path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Assets", myListBox.SelectedItem.ToString());LottieAnimationView.PauseAnimation();LottieAnimationView.FileName = path;LottieAnimationView.PlayAnimation();}}
}

案例中只是少数的json文件,可以去官网[2]下载更多json文件;源码[3]

参考资料

[1]

LottieSharp: https://github.com/ascora/LottieSharp

[2]

官网: https://lottiefiles.com/featured

[3]

源码: https://gitee.com/yanjinhua/LottieSharp

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

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

相关文章

【摄影测量原理】第一章:摄影测量学基础

目 录 第一节 摄影测量学的定义、任务 第二节 摄影测量与遥感的分类 第三节 摄影测量与遥感的发展历程 第四节 遥感主要应用领域及3S技术 第一节 摄影测量学的定义、任务 先来看一下例子&#xff1a; 思考&#xff1a; 1、摄影测量去常规测量的相同点与不同点&#…

云堆栈三大服务模式解析

如果准备使用云计算或者要在自己的IT环境中部署云计算&#xff0c;首先要确定合适的服务模式。这就需要我们对每种服务模式含义和特点都有所了解&#xff0c;很清楚从中能够获得哪些有益东西。正所谓“知己知彼百战不殆”&#xff0c;我们要对自己想要得到什么非常了解&#xf…

Excel数据生成SQL insert语句

CONCATENATE("insert into teacher(ID, NAME, ADDRESS) values (",A1,",",B1,",",C1,");")转载于:https://blog.51cto.com/kxtand/1704951

《看聊天记录都学不会Python到游戏实战?太菜了吧》(5)用前朝的剑斩今朝的官

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【摄影测量原理】第二章:单幅影像解析基础

本章提纲: 第一节 空中摄影基本知识第二节 中心投影与正射投影第三节 共线方程第四节 航摄像片的像点位移第五节 单幅影像解析基础第一节 空中摄影基本知识 2.1.1 航空摄影机 1. 光学航空摄影机 <

Blazor Hybrid / MAUI 简介和实战

1. BlazorBlazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架&#xff1a;使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI。共享使用 .NET 编写的服务器端和客户端应用逻辑。将 UI 呈现为 HTML 和 CSS&#xff0c;以支持众多浏览器&#xff0c;其中包括移动浏览器。与…

SpringMVC总结帖

SpringMVC是基于MVC设计理念的一款优秀的Web框架&#xff0c;是目前最流行的MVC框架之一&#xff0c;SpringMVC通过一套注解&#xff0c;让POPJ成为处理请求的控制器&#xff0c;而无需实现任何接口&#xff0c;然后使用实现接口的控制器也完全没问题&#xff1b;支持REST风格的…

基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面

系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客&#xff1f;基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.N…

关 于 解 析 php 的 问 题

在搭建discuz论坛的时候出的问题&#xff0c;上次搭建用的是2.2版本&#xff0c;这次下了个2.4版的Apache发现有好多地方不一样&#xff1b;比如在order deny allow 方面就变了Deny from all变成Require all deniedAllow from all变成Require all granted今天在配置完后开始在浏…

【摄影测量原理】第三章:双像立体测图

本章主要内容: 第一节 人眼的立体视觉和立体观测第二节 立体像对相对定向和核线几何第三节 立体像对的前方交会第四节 单元模型的绝对定向第五节 双像解析摄影测量 第一节 人眼的立体视觉和立体观测 1.1 人眼的立体视觉 人用双眼判断景物可判断其远近,得到…

linux源码编译emqttd,emqtt编译及简单测试记录

emqtt&#xff1a;在Erlang中实现的MQTT客户端库和命令行工具&#xff0c;支持MQTT v5.0 / 3.1.1 / 3.1。下载源码编译cd emqtt & make运行./rebar3 shell测试1、初始化{ok, ConnPid} emqtt:start_link([{clientid, "2020"},{keepalive, 0},{proto_ver, v5},{ho…

《看聊天记录都学不会C语言?太菜了吧》(18)2分钟搞结构体

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

「System Design」设计一个短链接系统

短链接系统可以把比较长的 URL 网址转换成简短的网址字符串&#xff0c;短链接的优势是方便传播。适合在一些对字符串长度有要求的场景中使用&#xff0c;比如短信&#xff0c;微博等&#xff0c;比如https://www.cnblogs.com/myshowtime/p/16227260.html转换成短链接为https:/…

iOS中 Animation 动画大全 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang 新浪微博&#xff01; iOS开发者交流QQ群&#xff1a; 4463102061.iOS中我们能看到的控件都是UIView的子类,比如UIButton UILabel UITextField UIImageView等等 2.UIView能够在屏幕的显示是因为在创建它的时候内部自动添加一个CALa…

IROS 2017上,这些厂商将会给我们展示什么样的黑科技?

相比起大多数AI学术会议&#xff0c;机器人领域最具影响力的学术会议IROS要“好看”得多。在这个学术会议上不仅会有AI和机器人领域最新的研究成果的论文展示&#xff0c;更有不少来自于科研机构和机器人领域公司机器人&#xff0c;向我们展示着展示机器之美。 比如&#xff0c…

《看聊天记录都学不会C#?太菜了吧》(3)变量:我大哥呢?$:小弟我罩着你!

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

linux block设备,Linux I/O Block--块设备的表示

块设备的分区信息由struct hd_struct结构描述&#xff0c;其中最重要的信息就是分区的起始扇区号和分区的大小。所有分区信息都一起保存在gendisk的part_tbl结构中&#xff0c;同时每个分区的block_device也可以通过bd_part来查询对应的分区信息。下图描述了block_device,gendi…

请来围观:WPF开发的微信客户端!!!

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;眾尋原文链接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/6058206.html公司的同事离职了&#xff0c;接下来的日子可能会忙碌&#xff0c;能完善DEMO的时间也会少了&#xff0c;因…

ios-新浪微博-下拉刷新获取最新的消息(解决消息重复的问题)(五)

2019独角兽企业重金招聘Python工程师标准>>> 第一步 在上一篇博文的基础上&#xff0c;利用新浪提供的since_id进行判断&#xff0c;在刷新监听的方法中&#xff0c;引入下面的代码 结果如下图 转载于:https://my.oschina.net/iOSliuhui/blog/520495

《看聊天记录都学不会Python到游戏实战?太菜了吧》(7)我用函数写了个特洛伊木马

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…