好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!
我承认这一篇比较标题党,不过下面这个GIF貌似也和适合这个标题嘛。
(画质比较烂是因为CSDN的博客图片限制在2M,所以我设置的是20帧,时间也很短,大家可以自己把项目拷回去慢慢看)
这个最终设计出来的样式:
中间的小圆点是一个Button,外面是一个经过切割的Grid,Grid里面还有一个Image。
其中在加上Image(地球图片)之前,Button还是很大的,所以给他设计了渐变色。
<Button Padding="20" Foreground="White" BorderBrush="#FFD8A00A"
FontSize="16" Click="OnClick" Margin="100" Width="20" Height="20"
RenderTransformOrigin="0.54,-0.058">
<Button.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="0"/>
<GradientStop Color="#FF45ADB7" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse x:Name="bg" Fill="{TemplateBinding Background}"
Stroke="{TemplateBinding BorderBrush}" StrokeThickness="2" />
<Ellipse x:Name="fr" Opacity="0" >
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#CCFFFFFF" Offset="0"/>
<GradientStop Offset="1"/>
<GradientStop Color="#7FFFFFFF" Offset="0.392"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter x:Name="ContentPresenter" Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True" >
<Setter TargetName="fr" Property="Opacity" Value="1"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
<Image Source="Earth.jpg" />
上面这两个控件都放到Grid内部。
<Grid x:Name="layoutroot">
<Grid.Resources>
<Storyboard x:Key="std">
<DoubleAnimation From="1" To="0" Duration="0:0:6"
Storyboard.TargetName="layoutroot"
Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].Offset"/>
<DoubleAnimation Duration="0:0:4.5" BeginTime="0:0:1.5" From="1" To="0"
Storyboard.TargetName="layoutroot"
Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].Offset"/>
<ColorAnimation Duration="0" To="#00000000" Storyboard.TargetName="layoutroot"
Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].Color"/>
</Storyboard>
</Grid.Resources>
<Grid.OpacityMask>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF000000" Offset="1"/>
<GradientStop Color="#FF000000" Offset="1"/>
</LinearGradientBrush>
</Grid.OpacityMask>
<Grid.Clip>
<EllipseGeometry Center="150 150" RadiusX="150" RadiusY="150"/>
</Grid.Clip>
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFCFCFC" Offset="0.003"/>
<GradientStop Color="#FF76253C" Offset="1"/>
<GradientStop Color="#FF29769D" Offset="0.318"/>
<GradientStop Color="#FFA94444" Offset="0.84"/>
<GradientStop Color="#FFB2B62F" Offset="0.488"/>
<GradientStop Color="#FF9B2BD3" Offset="0.666"/>
<GradientStop Color="#FF5CC569" Offset="0.151"/>
</LinearGradientBrush>
</Grid.Background>
</Grid>
上面这些都是给Grid设置的渐变色,有了Image也没太大用了。
真正有用的是Resources。
后台文件中的抖动效果如下(在上一篇详细介绍了抖动过程):
// 全局变量
private double left = 0;
private double top = 0;
private Storyboard storyboard = new Storyboard();
// 初始化
left = mainWindow.Left;
top = mainWindow.Top;
private void DoubleAnimation()
{
// 窗口抖动效果
DoubleAnimation doubleAnimationL1 = new DoubleAnimation();
doubleAnimationL1.BeginTime = TimeSpan.FromSeconds(0.01);
doubleAnimationL1.Duration = TimeSpan.FromSeconds(0.01);
doubleAnimationL1.From = mainWindow.Left;
doubleAnimationL1.To = mainWindow.Left - 6;
doubleAnimationL1.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };
Storyboard.SetTarget(doubleAnimationL1, mainWindow);
Storyboard.SetTargetProperty(doubleAnimationL1, new PropertyPath("(Left)"));
DoubleAnimation doubleAnimationL2 = new DoubleAnimation();
doubleAnimationL2.BeginTime = TimeSpan.FromSeconds(0.001);
doubleAnimationL2.Duration = TimeSpan.FromSeconds(0.01);
doubleAnimationL2.From = mainWindow.Left;
doubleAnimationL2.To = mainWindow.Left + 6;
doubleAnimationL2.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };
Storyboard.SetTarget(doubleAnimationL2, mainWindow);
Storyboard.SetTargetProperty(doubleAnimationL2, new PropertyPath("(Left)"));
DoubleAnimation doubleAnimationT1 = new DoubleAnimation();
doubleAnimationT1.BeginTime = TimeSpan.FromSeconds(0.01);
doubleAnimationT1.Duration = TimeSpan.FromSeconds(0.01);
doubleAnimationT1.From = mainWindow.Top;
doubleAnimationT1.To = mainWindow.Top + 6; ;
doubleAnimationT1.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };
Storyboard.SetTarget(doubleAnimationT1, mainWindow);
Storyboard.SetTargetProperty(doubleAnimationT1, new PropertyPath("(Top)"));
DoubleAnimation doubleAnimationT2 = new DoubleAnimation();
doubleAnimationT2.BeginTime = TimeSpan.FromSeconds(0.01);
doubleAnimationT2.Duration = TimeSpan.FromSeconds(0.01);
doubleAnimationT2.From = mainWindow.Top;
doubleAnimationT2.To = mainWindow.Top - 6;
doubleAnimationT2.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };
Storyboard.SetTarget(doubleAnimationT2, mainWindow);
Storyboard.SetTargetProperty(doubleAnimationT2, new PropertyPath("(Top)"));
storyboard.Children.Add(doubleAnimationL1);
storyboard.Children.Add(doubleAnimationL2);
storyboard.Children.Add(doubleAnimationT1);
storyboard.Children.Add(doubleAnimationT2);
storyboard.RepeatBehavior = RepeatBehavior.Forever;
storyboard.Completed += new EventHandler(storyboard_Completed);
storyboard.Begin(this, true);
}
private void storyboard_Completed(object sender, EventArgs e)
{
// 解除绑定
storyboard.Remove(this);
// 解除TextWindow窗口
storyboard.Children.Clear();
//grid.Children.Clear();
// 恢复窗口初始位置
mainWindow.Left = left;
mainWindow.Top = top;
}
后台文件中的消失效果如下:
// 全局变量
Storyboard storyboard2 = null;
// 初始化
storyboard2 = (System.Windows.Media.Animation.Storyboard)layoutroot.Resources["std"];
storyboard2.Completed += (t, r) => this.Close();
this.layoutroot.Loaded += (aa, bb) =>
{
EllipseGeometry ellipsegeometry = (EllipseGeometry)this.layoutroot.Clip;
double dx = layoutroot.ActualWidth / 2d;
double dy = layoutroot.ActualHeight / 2d;
ellipsegeometry.Center = new Point(dx, dy);
ellipsegeometry.RadiusX = dx;
ellipsegeometry.RadiusY = dy;
};
然后是Button的OnClick事件:
private void OnClick(object sender, RoutedEventArgs e)
{
if (storyboard2 != null)
{
storyboard2.Begin();
}
DoubleAnimation();
}
源码的话,上面也都有了。GIF我就不再上传咯,毕竟2M的限制太无趣了。
感谢您的访问,希望对您有所帮助。 欢迎大家关注、收藏以及评论。
为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp
好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!的更多相关文章
- 好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
原文:好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https:// ...
- 好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效button
我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单很多. 首先是定义一个TextBlock例如以下. <Grid> <TextBlock Name=& ...
- 好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字
原文:好玩的WPF第一弹:窗口抖动+边框阴影效果+倒计时显示文字 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csd ...
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- WPF WebBrowser屏蔽弹出alert ,confirm ,prompt ,showModalDialog() ,window.open()
WPF WebBrowser屏蔽弹出alert ,confirm ,prompt ,showModalDialog() ,window.open()添加Microsoft.mshtml.dll,然后写 ...
- WPF案例 (三) 模拟QQ“快速换装"界面
原文:WPF案例 (三) 模拟QQ"快速换装"界面 这个小程序使用Wpf模拟QQ快速换装页面的动画特效,通过使用组合快捷键Ctrl+Left或Ctrl+Right,可实现Image ...
- 『PyTorch』第三弹重置_Variable对象
『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...
- codechef营养题 第三弹
第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...
- WPF入门(三)->几何图形之不规则图形(PathGeometry) (2)
原文:WPF入门(三)->几何图形之不规则图形(PathGeometry) (2) 上一节我们介绍了PathGeometry中LineSegment是点与点之间绘制的一条直线,那么我们这一节来看 ...
随机推荐
- jquery-12 jquery的ajax如何使用
jquery-12 jquery的ajax如何使用 一.总结 一句话总结:就是$.get()和$.post()方法的使用,看参考手册就好,与php的交互. 1.删除元素的时候如何设置删除特效? ani ...
- A Guide to Python's Magic Methods
Book Source:[https://rszalski.github.io/magicmethods/] magic methods: 名称前后有双下划线的方法 构造函数和初始化 初始化类实例时, ...
- FAST特征点检测&&KeyPoint类
FAST特征点检测算法由E.Rosten和T.Drummond在2006年在其论文"Machine Learning for High-speed Corner Detection" ...
- printk()函数的总结
我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况.对程序的调试起到了很重要的作用.(下文中的日志级别和控制台日志控制级别是一 ...
- PatentTips - Fast awake from low power mode
BACKGROUND Electronic devices, such as electronic book readers ("eBook reader devices"), c ...
- Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置
原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Librari ...
- ios 第一篇文章-xcode6.2键盘调不出来
ios 第一篇文章 不晓得有没有人遇到过ios代码内调用键盘(keyboard)调不出来的情况,反正我是遇到了,按官方文档的说法调用键盘事件非常easy事实上: 我用了之后,不晓得为嘛,键盘就是不显示 ...
- 给自己的java程序生成API帮助文档
一.问题发现: 课本上提到"要学会给自己编写的程序生成API帮助文档",但又没有说明具体的操作步骤. 二.分析: API帮助文档有什么用?这么理解吧:如果想告诉别人你的类如何使用, ...
- java生成二维码,读取(解析)二维码图片
二维码分为好多种,我们最常用的是qrcode类型的二维码,以下有三种生成方式以及解析方式: 附所需jar包或者js地址 第一种:依赖qrcode.jar import java.awt.Color; ...
- WPF入门(三)->两个几何图形合并(CombinedGeometry)
原文:WPF入门(三)->两个几何图形合并(CombinedGeometry) 在WPF中,提供了一个CombinedGeometry对象可以使两个几何图形合并产生效果 CombinedGeom ...