撩妹小工具MarvellousMouse
前言
之前在知乎闲逛看有意思的项目的时候,发现一个前辈曾做过一个在鼠标周围随机生成爱心的小程序,闲来无聊实现了一版随机生成彩色小球的(因为没有女朋友,只是练练手)。最近疫情在网上撩了一个小妹妹,她知道这个程序之后,让我给她做一个“格桑花”版的。我想着应该差不多,就改了改代码。好感度+1(不一定有),但是妹汁送我一杯奶茶,嘻嘻。话不多说,下面介绍一下。
实现
总的思路很简单,就是获取鼠标的位置,然后再鼠标周围随机进行动画。实现主要分为这几个函数。
InitProperty(); //初始化动画配置,放到多大,透明度多少,持续时间 InitGraph(); //初始化需要放大的样式,只要继承FrameworkElement类就可以了
MaxmizeAndTransparenceWindow(); //窗口设置,设置全屏,还有一个坑(放大比)
StartMarvellousMouse(); //核心代码,随机生成小球
1.初始化属性
这里动画主要是样式放大的一些设置:长宽,透明度。是WPF比较基础的类FrameworkElement的属性。
private void InitProperty() {
MyStoryBoard = new Storyboard();
//MyStoryBoard.RepeatBehavior = RepeatBehavior.Forever;
DAWidth = new DoubleAnimation();
DAWidth.From = 0;
DAWidth.To = 2 * Radius;
DAWidth.Duration = new Duration(TimeSpan.FromMilliseconds(DurationTime));
DAHeight = new DoubleAnimation();
DAHeight.From = 0;
DAHeight.To = 2 * Radius;
DAHeight.Duration = new Duration(TimeSpan.FromMilliseconds(DurationTime));
DAOpacity = new DoubleAnimation();
DAOpacity.From = 0;
DAOpacity.To = 0.7;
DAOpacity.Duration = new Duration(TimeSpan.FromMilliseconds(DurationTime));
MyStoryBoard.Children.Add(DAWidth);
MyStoryBoard.Children.Add(DAHeight);
MyStoryBoard.Children.Add(DAOpacity);
}
2.初始化样式
这里一开始是使用WPF的自定义控件比如ellipse,等。后来给妹汁做格桑花的时候,突然想到:图片不就是天然的FrameworkElement嘛,所以理论上啥样式都已放进图片并显示。顺带说一句,图片资源获取网上搜一下,然后在Google活bing的识图里面找类似的。
很难找到背景透明的图(比如带白底),可以用ps工具,或者网上的去底色工具或网址(我直接百度搜了个网址就可以用)。反正图片放大的也不大,略微丢失一点边边角角无伤大雅。
private void InitGraph() {
var elements =ElementProvider.GetElements<MyImage>();
if (elements != null)
{
foreach (var item in elements)
{
this.canvas.Children.Add(item);
}
}
NumofGrap = this.canvas.Children.Count;
}
3.屏幕最大化及一些设置
这里的一个坑就是,不是所有的屏幕都是100%放大,在一些笔记本上可能分辨率调的超级高,然偶后放大到200%,所以鼠标位置会有问题。这里计算了下放大比,然后鼠标的XY乘以系数。
private void MaxmizeAndTransparenceWindow() {
this.Width = SystemParameters.PrimaryScreenWidth;
this.Height = SystemParameters.PrimaryScreenHeight;
var hdc = GetDC(GetDesktopWindow());
int ResolutionHeight = GetDeviceCaps(hdc, 10); //高
int ResolutionWidth = GetDeviceCaps(hdc, 8); //宽
ScaleX = (double)(ResolutionWidth / Width);
ScaleY = (double)(ResolutionHeight / Height);
this.Top = 0;
this.Left = 0;
this.WindowStyle = WindowStyle.None;
this.ResizeMode = ResizeMode.NoResize;
this.Topmost = true;
}
4.核心显示
就是不停地获取鼠标位置,然后随机再鼠标周围生成图案。这里因为是死循环疯狂更新,所以内存会爆炸。所以设置线程需要休息一会会再发送(及时1ms也足够了)。
private void StartMarvellousMouse() {
POINT lpPoint;
var widthProperty = new PropertyPath("Width");
var heightProperty = new PropertyPath("Height");
var opacityProperty = new PropertyPath("Opacity");
new Thread(() =>
{
while (true)
{
for (int i = 0; i < NumofGrap; i++)
{
GetCursorPos(out lpPoint);
Dispatcher.BeginInvoke(new Action(() =>
{
if (i == NumofGrap) return; //防止循环i=NumofGrap的时候,ui线程正好访问
var item = (FrameworkElement)this.canvas.Children[i];
Canvas.SetLeft(item, (lpPoint.X - Radius + RandomDistance) / ScaleX);
Canvas.SetTop(item, (lpPoint.Y - Radius + RandomDistance) / ScaleY);
//item.Fill = RandomColor;
Storyboard.SetTarget(DAWidth, item);
Storyboard.SetTargetProperty(DAWidth, widthProperty);
Storyboard.SetTarget(DAHeight, item);
Storyboard.SetTargetProperty(DAHeight, heightProperty);
Storyboard.SetTarget(DAOpacity, item);
Storyboard.SetTargetProperty(DAOpacity, opacityProperty);
MyStoryBoard.Begin();
}));
Thread.Sleep((int)DurationTime / NumofGrap);
}
}
}).Start();
}
最后预祝我能追到妹汁吧,感谢。
代码开源:git@github.com:liuchuomidi/MarvellousMouse.git
以上是 撩妹小工具MarvellousMouse 的全部内容, 来源链接: utcz.com/z/520291.html