WPF关键帧动画

动画与关键帧的区别

本章介绍关键帧动画之前, 首先需要讲解一下关于WPF当中基础动画与本章所讲的关键帧动画的区别。

视频地址: WPF扩展合集_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

普通动画

WPF基础动画当中, 我们熟悉的From/To/By驱动的动画, 主要在两个值之间创建过渡效果, 如下图所示:
075ba32fb87bdc31a7adc893b169c754.png下面是使用普通的ThicknessAnimation创建的爱心跳动的动画
9b2b4f96ee9e2a69d3c81601c4172eeb.gif


关键帧

对于关键帧动画而言,关键帧动画没有From/To/By的属性, 而关键帧动画的值则是使用帧对象来进行描述, 故称之为关键帧动画, 如下所示:
10546839d5fb9701c661d29ff1485e97.png

下面是使用关键帧动画创建的一个矩形位移的动画
ccd358d7085f127c8ce9c0f22287f30d.gif

说明: 能够注意到, 左下角, 描述了整个动画的过程:
1. 首先5秒内, 矩形从位置0 -> 500

 LinearDoubleKeyFrame Value="500" KeyTime="0:0:5"
2. 从5-10秒内, 矩形位置500 -> 200 

SplineDoubleKeyFrame KeySpline="0.25,0.5 0.75,1" Value="200" KeyTime="0:0:10"
3. 从10-12秒内, 矩形位置200 -> 290 

LinearDoubleKeyFrame Value="290" KeyTime="0:0:12"
4. 从12-13.5秒内, 矩形位置290 -> 300 

LinearDoubleKeyFrame Value="300" KeyTime="0:0:13.5"
5. 从13.5-15秒内, 矩形位置300 -> 0 

SplineDoubleKeyFrame KeySpline="0.25,0.5 0.75,1" Value="0" KeyTime="0:0:15"


注: 关键帧对象(Frame) 主要包含两个参数, Value是目标值, KeyTime 则表达的是时间

到目前为止, 我们应该可以理解普通动画与关键帧动画的区别, 对于帧动画而言, 在于控制每一个帧的表现形式, 这一点并不像普通动画中, 对于整个动画的控制我们只能从开始到结束, 而帧动画可以控制开始到结束的整个过程。


介绍关键帧动画

下面,介绍了如何创建一个简单的关键帧动画。
1.如下代码,创建了一个矩形, 为其添加了一个点击时间触发动画, 该动画在Storyboard中定义并且触发:

<Border Width="400" BorderBrush="Black">  <Rectangle Fill="Blue" Width="50" Height="50"HorizontalAlignment="Left"><Rectangle.RenderTransform><TranslateTransform x:Name="MyAnimatedTranslateTransform" X="0" Y="0" /></Rectangle.RenderTransform><Rectangle.Triggers><EventTrigger RoutedEvent="Rectangle.MouseLeftButtonDown"><BeginStoryboard><Storyboard><DoubleAnimationUsingKeyFramesStoryboard.TargetName="MyAnimatedTranslateTransform"Storyboard.TargetProperty="X"Duration="0:0:10"><LinearDoubleKeyFrame Value="0" KeyTime="0:0:0" /><LinearDoubleKeyFrame Value="350" KeyTime="0:0:2" /><LinearDoubleKeyFrame Value="50" KeyTime="0:0:7" /><LinearDoubleKeyFrame Value="200" KeyTime="0:0:8" />                          </DoubleAnimationUsingKeyFrames></Storyboard></BeginStoryboard></EventTrigger></Rectangle.Triggers> </Rectangle></Border>

说明:以上的创建了一个DoubleAnimation类型的帧动画, 为其绑定了一个目标及目标的动画依赖属性 "Y", Duration则为其设定了一个帧动画持续时间,在关键帧动画的集合中, 定义了多个线性关键帧(LinearDoubleKeyFrame), 为其设定了Value目标值和KeyTime持续时间。

此处说讲到的线性关键帧所属其中的一种类型, 在后面将会有更多的介绍。

关键帧动画类型

关键帧动画属于System.Windows.Media.Animation命令空间下, 命名规则约定为
AnimationUsingKeyFrames
Type: 为动画的值类型, 例如上面的动画当中, 需要给矩形的X轴移动位置, X的值属于双精度类型, 所以定义的类型为 :DoubleAnimationUsingKeyFrames 。

关键帧的动画类型列表

3a90fa26a2be6a650661dd45b2fcb38e.png

帧对象的类型

正如我们创建不同类型的动画, 我们需要按照约定命名方式定义, 如: DoubleAnimation, ColorAnimation 等等。
对于帧动画而言, 主要由一个或者N个帧对象组成(Frame), 帧对象同时也拥有不同的种类, 故帧对象遵循一下的命名约定:
<插值方法><类型>
插值方法: 是帧对象使用的插值方法, 如: 离散(Discrete)、线性(Linear) 、样条(Spline) 等。
类型: 是动画的值类型, 例如Double、Decimal等。
KeyFrame: 固定的帧对象语法结束

关键帧的主要目的是指定 和KeyTime、Value 每个关键帧类型都可提供这两种属性。

  • 属性Value指定该关键帧的目标值。

  • 该KeyTime属性指定何时(在动画的Duration)中到达关键帧。 Value
    当关键帧动画开始时,按其KeyTime属性定义的顺序遍历其关键帧。

  • 如果时间 0 时没有关键帧,动画会在目标属性的当前值和第Value一个关键帧之间的转换;否则,动画的输出值将成为第一个关键帧的值。

  • 动画使用第二个关键帧指定的Value插值方法在第一个关键帧和第二个关键帧之间创建过渡。转换从第一个关键帧开始KeyTime,并在到达第二个关键帧KeyTime时结束。

  • 动画将继续,这会创建每个后续关键帧和其前面的关键帧之间的过渡。

  • 最后,动画转换为关键帧的值,其最大键时间等于或小于动画的值Duration。
    如果动画的Duration或Automatic其Duration等于最后一个关键帧的时间,则动画结束。否则,如果动画大于Duration最后一个关键帧的键时间,则动画将保留关键帧值,直到到达其Duration的末尾。与所有动画一样,关键帧动画使用其FillBehavior属性来确定在到达活动周期结束时是否保留最终值。

插值方法

下面将主要介绍有三种不同类型的内插方法: 线性、离散和曲线。

线性内插

使用线性内插,动画将以段持续时间的固定速度进行播放。例如,如果关键帧段从 0 过渡到 10,持续时间为 5 秒,则动画会在指定时间输出以下值:
c06ec818fc75fac10d01d5ca5fbed7b3.png

离散内插

使用离散内插,动画函数将从一个值跳到下一个值,没有内插。如果关键帧段从 0 过渡到 10,持续时间为 5 秒,则动画会在指定时间输出以下值:
d9d737b46eeb6531d1931f5651047028.png

注: 通过观察线性和离散的插入比较, 可以清晰的看出来, 离线类型的插入方式, 在动画的执行过程中, 我们无法在规定的时间内观察其变化效果, 直接至时间结束后, 到指定的目标值。

曲线内插

曲线内插可能很难理解;使用不同的设置进行体验有助于理解。通过主曲线动画示例,可以更改主曲线值,并查看由此所产生的动画结果, 可以查看最上方视频进行理解。

组合内插

可在一个关键帧动画中使用具有不同内插类型的关键帧。如果两个具有不同内插的关键帧动画彼此跟随,第二个关键帧的内插方法将用于创建从第一个值到第二个值的过渡。
下面的示例,演示了一个使用DoubleAnimationUsingKeyFrames创建使用线性、拼接和离散插值的示例:

<Rectangle Width="50"Height="50"Fill="Orange">  <Rectangle.RenderTransform><TranslateTransform x:Name="ComboAnimatedTranslateTransform" X="0" Y="0" /></Rectangle.RenderTransform><Rectangle.Triggers><EventTrigger RoutedEvent="Rectangle.Loaded"><BeginStoryboard><Storyboard><DoubleAnimationUsingKeyFramesStoryboard.TargetName="ComboAnimatedTranslateTransform"Storyboard.TargetProperty="X"Duration="0:0:15"RepeatBehavior="Forever"><DiscreteDoubleKeyFrame Value="500" KeyTime="0:0:7" /><LinearDoubleKeyFrame Value="200" KeyTime="0:0:10" /><SplineDoubleKeyFrame Value="350" KeyTime="0:0:15"  KeySpline="0.25,0.5 0.75,1" />                      </DoubleAnimationUsingKeyFrames>           </Storyboard></BeginStoryboard></EventTrigger></Rectangle.Triggers> 
</Rectangle>

Duration与KeyTime

与其他动画一样,关键帧动画具有属性Duration。除了指定动画的Duration外,还需要指定每个关键帧的持续时间的哪一部分。为此,您可以为每个动画的关键KeyTime帧描述 。每个关键帧指定KeyTime该关键帧的结束时间。
属性KeyTime不指定密钥时间播放的时间。关键帧的播放时长由关键帧的结束时间、前一个关键帧的结束时间以及动画的持续时间确定。关键时间可以指定为时间值、百分比或特殊值Uniform或Paced。

TimeSpan

以下示例演示一个持续时间为 10 秒钟、有四个关键帧(这些关键帧的关键时间指定为时间值)的动画。

  • 在前 3 秒钟内,第一个关键帧在基值和 100 之间进行动画处理,结束时间 = 0:0:03。

  • 第二个关键帧在 100 和 200 之间进行动画处理。它在第一个关键帧结束后开始(开始时间 = 3 秒),播放 5 秒钟,结束时间 = 0:0:8。

  • 第三个关键帧在 200 和 500 之间进行动画处理。它在第二个关键帧结束时开始(开始时间 = 8 秒),播放 1 秒钟,结束时间 = 0:0:9。

  • 第四个关键帧在 500 和 600 之间进行动画处理。它在第三个关键帧结束时开始(开始时间 = 9 秒),播放 1 秒钟,结束时间 = 0:0:10。

<Rectangle Width="50" Height="50" Fill="Blue"><Rectangle.RenderTransform><TranslateTransform x:Name="TranslateTransform01" X="10" Y="30" /></Rectangle.RenderTransform><Rectangle.Triggers><EventTrigger RoutedEvent="Rectangle.Loaded"><BeginStoryboard><Storyboard><DoubleAnimationUsingKeyFrames Storyboard.TargetName="TranslateTransform01" Storyboard.TargetProperty="X"Duration="0:0:10"RepeatBehavior="Forever"><!-- KeyTime properties are expressed as TimeSpan values which are in the form of "hours:minutes:seconds". --><LinearDoubleKeyFrame Value="100" KeyTime="0:0:3" /><LinearDoubleKeyFrame Value="200" KeyTime="0:0:8" /><LinearDoubleKeyFrame Value="500" KeyTime="0:0:9" /><LinearDoubleKeyFrame Value="600" KeyTime="0:0:10" /></DoubleAnimationUsingKeyFrames></Storyboard></BeginStoryboard></EventTrigger></Rectangle.Triggers>
</Rectangle>

百分比

百分比值指定关键帧以动画的某些Duration百分比结束。在 XAML 中,指定百分比作为 % 符号后的数字。在代码中,使用FromPercent方法并传递一个Double指示百分比的方法。该值必须大于或等于 0 并且小于或等于 100%。以下示例演示一个持续时间为 10 秒钟、有四个关键帧(这些关键帧的关键时间指定为百分比)的动画。

  • 在前 3 秒钟内,第一个关键帧将在基值和 100 之间进行动画处理,结束时间 = 0:0:3。

  • 第二个关键帧在 100 和 200 之间进行动画处理。它在第一个关键帧结束后开始(开始时间 = 3 秒),播放 5 秒钟,结束时间 = 0:0:8 (0.8 * 10 = 8)。

  • 第三个关键帧在 200 和 500 之间进行动画处理。它在第二个关键帧结束时开始(开始时间 = 8 秒),播放 1 秒钟,结束时间 = 0:0:9 (0.9 * 10 = 9)。

  • 第四个关键帧在 500 和 600 之间进行动画处理。它在第三个关键帧结束时开始(开始时间 = 9 秒),播放 1 秒钟,结束时间 = 0:0:10 (1 * 10 = 10)。

<Rectangle Height="50" Width="50" Fill="Purple"><Rectangle.RenderTransform><TranslateTransform x:Name="TranslateTransform02" X="10" Y="110" /></Rectangle.RenderTransform><Rectangle.Triggers><EventTrigger RoutedEvent="Rectangle.Loaded"><BeginStoryboard><Storyboard><DoubleAnimationUsingKeyFrames Storyboard.TargetName="TranslateTransform02" Storyboard.TargetProperty="X"Duration="0:0:10"RepeatBehavior="Forever"><!-- KeyTime properties are expressed as Percentages. --><LinearDoubleKeyFrame Value="100" KeyTime="30%" /><LinearDoubleKeyFrame Value="200" KeyTime="80%" /><LinearDoubleKeyFrame Value="500" KeyTime="90%" /><LinearDoubleKeyFrame Value="600" KeyTime="100%" /></DoubleAnimationUsingKeyFrames></Storyboard></BeginStoryboard></EventTrigger></Rectangle.Triggers>
</Rectangle>

Uniform

当您Uniform希望每个关键帧花费相同的时间时,请使用计时。
Uniform关键时间将可用时间平均除以关键帧数,以确定每个关键帧的结束时间。下面的示例显示持续时间为 10 秒的动画和四个关键帧,其关键时间指定为Uniform。

  • 在前 2.5 秒钟内,第一个关键帧在基值和 100 之间进行动画处理,结束时间 = 0:0:2.5。

  • 第二个关键帧在 100 和 200 之间进行动画处理。它在第一个关键帧结束后开始(开始时间 = 2.5 秒),播放大约 2.5 秒钟,结束时间 = 0:0:5。

  • 第三个关键帧在 200 和 500 之间进行动画处理。它在第二个关键帧结束时开始(开始时间 = 5 秒),播放 2.5 秒钟,结束时间 = 0:0:7.5。

  • 第四个关键帧在 500 和 600 之间进行动画处理。它在第二个关键帧结束时开始(开始时间 = 7.5 秒),播放 2.5 秒钟,结束时间 = 0:0:1。

<Rectangle Height="50" Width="50" Fill="Red"><Rectangle.RenderTransform><TranslateTransform x:Name="TranslateTransform03" X="10" Y="190" /></Rectangle.RenderTransform><Rectangle.Triggers><EventTrigger RoutedEvent="Rectangle.Loaded"><BeginStoryboard><Storyboard><DoubleAnimationUsingKeyFrames Storyboard.TargetName="TranslateTransform03" Storyboard.TargetProperty="X"Duration="0:0:10"RepeatBehavior="Forever"><!-- KeyTime properties are expressed with values of Uniform. When a key time is set to "Uniform" the total allotted time of the animation is divided evenly between key frames.  In this example, the total duration of the animation is ten seconds and there are four key frames each of which are set to "Uniform", therefore, the duration of each key frame is 3.3 seconds (10/3). --><LinearDoubleKeyFrame Value="100" KeyTime="Uniform" /><LinearDoubleKeyFrame Value="200" KeyTime="Uniform" /><LinearDoubleKeyFrame Value="500" KeyTime="Uniform" /><LinearDoubleKeyFrame Value="600" KeyTime="Uniform" /></DoubleAnimationUsingKeyFrames></Storyboard></BeginStoryboard></EventTrigger></Rectangle.Triggers>
</Rectangle>

Paced

如果要Paced以恒定速率进行动画处理,请使用计时。
Paced关键时间根据每个关键帧的长度分配可用时间,以确定每个帧的持续时间。这样,动画的速度或速率将保持不变。下面的示例显示持续时间为 10 秒的动画和三个关键帧,其关键时间指定为Paced。

<Rectangle Height="50" Width="50" Fill="Orange"><Rectangle.RenderTransform><TranslateTransform x:Name="TranslateTransform04" X="10" Y="270" /></Rectangle.RenderTransform><Rectangle.Triggers><EventTrigger RoutedEvent="Rectangle.Loaded"><BeginStoryboard><Storyboard><DoubleAnimationUsingKeyFrames Storyboard.TargetName="TranslateTransform04" Storyboard.TargetProperty="X"Duration="0:0:10"RepeatBehavior="Forever"><!-- KeyTime properties are expressed with values of Paced. Paced values are used when a constant rate is desired. The time allocated to a key frame with a KeyTime of "Paced" is determined by the time allocated to the other key frames of the animation. This time is calculated to attempt to give a "paced" or "constant velocity" for the animation. --><LinearDoubleKeyFrame Value="100" KeyTime="Paced" /><LinearDoubleKeyFrame Value="200" KeyTime="Paced" /><LinearDoubleKeyFrame Value="500" KeyTime="Paced" /><LinearDoubleKeyFrame Value="600" KeyTime="Paced" /></DoubleAnimationUsingKeyFrames></Storyboard></BeginStoryboard></EventTrigger></Rectangle.Triggers>
</Rectangle>

关键帧时间及顺序

可以在同一动画中使用具有不同KeyTime值类型的关键帧。尽管建议以关键帧的实际播放顺序来添加关键帧,但此操作不是必需的。动画和计时系统能够处理顺序紊乱的关键帧。将忽略关键时间无效的关键帧。
下表描述了为关键帧动画的关键帧解析关键时间的过程。
1. 解析TimeSpanKeyTime值。
2. 确定动画的总内插时间,即关键帧动画完成向前迭代所需的全部时间。
如果动画的Duration不是Automatic或Forever,则总插值时间是动画Duration属性的值。
否则,总插值时间是其关键帧(TimeSpanKeyTime如果有)之间指定的最大值。
否则,总内插时间为 1 秒。
3 使用总插值时间值解析PercentKeyTime值。
4 如果最后一个关键帧尚未在之前步骤中解析,则将解析该关键帧。如果最后KeyTime一个关键帧为Uniform或Paced,则其解析时间将等于总插值时间。
如果 KeyTime 第一个关键帧的为 Paced ,且此动画在关键帧上具有多个,则将其值解析为 KeyTime 零; 如果只有一个关键帧,并且它的 KeyTime 值为 Paced ,则会将其解析为总内插时间,如前一步骤中所述。
5 解析剩余UniformKeyTime值:每个值都给定可用时间的相等份额。在此过程中PacedKeyTime,未解析的值将暂时视为UniformKeyTime值,并获得临时解析的时间。
6 使用声明KeyTime的最接近具有已解析KeyTime值的关键帧,解决未指定密钥时间的关键帧的值。
7 解析剩余PacedKeyTime值。PacedKeyTime使用相邻KeyTime关键帧的值来确定其解析时间。目的是确保动画速度在此关键帧的解析时间内保持固定不变。
8 按解析时间(主键)和声明顺序(辅助键)对关键帧进行排序,即根据已解决的关键帧KeyTime值使用稳定排序。

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

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

相关文章

Mac怎么不能拷贝文件到U盘

2019独角兽企业重金招聘Python工程师标准>>> 在日常生活中&#xff0c;我们常常需要把一些文件拷贝的U盘保存。但是一些使用MAC的用户&#xff0c;有时会遇到无法拷贝的情况。今天我们就来给大家介绍介绍MAC怎么不能拷贝文件到U盘&#xff0c;以及面对这种情况我们应…

最漂亮的女生

转载于:https://blog.51cto.com/6254695/1071754

dockerfile文件名_Linux云计算教程全套视频合集:Dockerfile详解(一)

我们可以把刚才的对容器的所有操作命令都记录到一个文件里&#xff0c;就像写更脚本程序。之后用 docker build 命令以此文件为基础制作一个镜像&#xff0c;并会自动提交到本地仓库。这样的话镜像的构建会变的透明化&#xff0c;对镜像的维护起来也更加简单&#xff0c;只修改…

Android之放大镜实现的两种方式

public class ShaderView extends View {private final Bitmap bitmap;private final ShapeDrawable drawable;// 放大镜的半径private static final int RADIUS 80;// 放大倍数private static final int FACTOR 3;private final Matrix matrix new Matrix();public ShaderV…

他把数学书当小说看,初中没毕业却敢自荐中科大数学研究生,现在天才都这么狂妄了吗?...

全世界只有3.14 % 的人关注了爆炸吧知识他的脑子不太像人脑太聪明了今天&#xff0c;超模君来介绍一位看数学书像看小说一样的天才吧。他是初中没毕业&#xff0c;靠自学8年&#xff0c;便成为文 革后第一个被中科大破格录取的数学研究生。他只坚持做了10年数学研究&#xff0c…

微软RPA工具Power Automate Desktop

什么是RPARPA&#xff08;机器人流程自动化&#xff09;系统是一种应用程序&#xff0c;它通过模仿用户在电脑上的操作方法, 实现自动化操作流程,协助人在计算机、手机等计算设备中完成重复的工作流任务。Power Automate Desktop2021年3月2日&#xff0c;Microsoft终于宣布面向…

MS UC 2013-2-Deploy Microsoft Exchange Server 2013-4-Post-Installation Tasks

Blog:http://dynamic.blog.51cto.com MSN:LiuJinFengmsn.com QQ:316190099《MS UC 2013 -系列》博文&#xff1a;1&#xff09; 以TechNet Library为技术资料原型。2&#xff09; 以0-《统一沟通-微软-实战》为基础。3&#xff09; 以1-《统一沟通-微软-技巧》为参照。4&#x…

作为一个程序员,进步完全取决于自己

2015-12-14 我曾经在Hacker News网站上读过一篇帖子的评论&#xff0c;其中一个年轻的程序员说他们不想呆在那些只会让思想陈旧的老程序员离开而不是对他们再次培训的公司里&#xff0c;因为他明白&#xff0c;有一天他们也会这样。 也许这个人的本意是好的&#xff0c;但是他…

如何优雅地向导师/老板表示:“上周工作没什么进展”?

全世界只有3.14 % 的人关注了爆炸吧知识学生时代最怕导师问进度实验数据有了吗&#xff1f;结论有了吗?社畜时最怕老板问进度客户签合同了吗方案改出来了吗重点从来都不是被问&#xff0c;而是没什么进展还要硬着头皮汇报应对这种情况小编总结了三句口诀&#xff1a;反客为主&…

Android之如果解决Android studio项目里面的类名不能重命名

问题&#xff1a;改类名修改不了 今天师傅要我给那个在activity里面不规范的类名&#xff0c;类名是SearchUser.改成SearchUserActivity,发现改不了出了一下问题&#xff0c;如下图 如何解决的&#xff1a; 点击下面的&#xff08;85&#xff1a;56&#xff09;行&#xff0c…

python葡萄酒数据集_利用python分析红葡萄酒数据

在本次分析中&#xff0c;我使用了随机森林回归&#xff0c;并涉及数据标准化和超参数调优。在这里&#xff0c;我使用随机森林分类器&#xff0c;对好酒和不太好的酒进行二元分类。首先导入数据包&#xff1a;importnumpy as npimportpandas as pdimportmatplotlib.pyplot as …

Codeforces 365C - Matrix(hash + yy)

题意&#xff1a;给定你一个数串s&#xff0c;再给你一个 a &#xff0c;问你在矩阵d(第i&#xff0c;j个元素为si*sj)有多少个小矩形的和为a 解题思路&#xff1a;可知 a &#xff08;s[x] s[x1] ....s[y]&#xff09;* (s[p]s[p1]....s[q]); 我们只需要枚举各字串的和…

耗时3年,集齐102位中国摄影师,央视这部纪录片BBC也无法超越......

全世界只有3.14 % 的人关注了爆炸吧知识地球上已知的植物有三十多万种&#xff0c;其中十分之一生长在中国。这些植物不仅为中国带来福祉&#xff0c;还不断迁徙到世界各地。在人类的不懈努力下&#xff0c;它们又获得了新的姿态&#xff0c;为不同的文明带来不一样的色彩。《影…

十五天精通WCF——第十一天 如何对wcf进行全程监控

说点题外话&#xff0c;我们在玩asp.net的时候&#xff0c;都知道有一个叼毛玩意叫做“生命周期”&#xff0c;我们可以用httpmodule在先于页面的page_load中 做一些拦截&#xff0c;这样做的好处有很多&#xff0c;比如记录日志&#xff0c;参数过滤&#xff0c;全局登录验证等…

Android之MVP 模式:简单易懂的介绍方式

转载&#xff1a;https://segmentfault.com/a/1190000003927200 Android MVP Pattern Android MVP 模式1 也不是什么新鲜的东西了&#xff0c;我在自己的项目里也普遍地使用了这个设计模式。当项目越来越庞大、复杂&#xff0c;参与的研发人员越来越多的时候&#xff0c;MVP 模…

mysql dw解决方案_MySQL 的 DW 解决方案(MySQL + Infobright)

随着 BI (DW) 在各个企业中重要性的不断提升&#xff0c;各个数据库厂家都希望能搭上这辆班车。这不&#xff0c;MySQL 也联合 Infobright 一起推出了开源的 数据仓库解决方案&#xff0c;而且是开源的。 其实现的各种DW该有的功能就不多说了&#xff0c;但是 Infobright 有一点…

EasyNetQ操作RabbitMQ

EasyNetQ 是一个容易使用&#xff0c;专门针对RabbitMQ的 .NET API。EasyNetQ是为了提供一个尽可能简洁的适用与RabbitMQ的.NET类库。下面看下怎么集成。1、nuget 安装2、配置连接串public static IBus CreateMessageBus(){// 消息服务器连接字符串var connectionString Confi…

男人穿女友的丝袜,只有0次和无数次....

全世界只有3.14 % 的人关注了爆炸吧知识男人爱穿丝袜是刻在基因里的今天是上班第二天&#xff0c;想必很多模友都还没有进入状态&#xff0c;所以超模君准备了一波奇奇怪怪的知识&#xff0c;给各位模友提提神。咱们要讲的&#xff0c;是一种让不少直男听了老脸一红的贴身衣物—…

使用gulp-connect实现web服务器

安装插件安装gulp-connect插件&#xff0c;安装命令如下 npm install --save-dev gulp-connect 定义web服务&#xff0c;gulpfile.js代码 var gulp require(gulp),connect require(gulp-connect), //实现web服务器插件gulp.task(default, function() { });//使用connect实现w…

Android之基于xmpp openfire smack开发之openfire介绍和部署[1]

http://blog.csdn.net/forlong401/article/details/33730365 前言 Java领域的即时通信的解决方案可以考虑openfiresparksmack。当然也有其他的选择。 Openfire是基于Jabber协议(XMPP)实现的即时通信服务器端版本&#xff0c;目前建议使用3.8.1版本&#xff0c;这个版本是当前最…