2020-03-26 11:45发布
wpf模拟抖音很火的罗盘时钟,附源码,解压就能跑
前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~ 错错错,黑底白字的罗盘时钟!
作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf,写个属于.net自己的罗盘时钟,目前只实现了时分秒,农历日期等逻辑都是一样的,所以就略了,有兴趣的朋友,可以继续深入!
最开始想直接弄成成exe,方便拷贝,到处运行使用的,但是考虑到,万一有网友朋友们需要,所以我还是把封成一个dll,需要的地方添加引用即可!
为了弄这个,还恶补了下,高中还是初中的知识,sin30,cos60,呵呵,正弦,余弦,所以不明白的朋友们需要先了解清楚这个,因为罗盘是旋转,需要用到计算这个值!
不废话了,先上图看下效果!
ok,整体效果就是这样了,中间是鄙人的名称缩写,抖音上是很潦草的,我就随便啦,占个位置,不然显得很空洞!
下面说说代码
主要是,RomeClockControlLibrary,这个是对控件的封装,上面那个启动程序只是一个容器,或者说是调用者,当然,如果要达到我这个效果,实现圆形的窗口透明的朋友们,可以看下借鉴!
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:RomeClockControlLibrary"mc:Ignorable="d"d:DesignHeight="450"d:DesignWidth="800">Background="#000000">上面是前端代码,有点基础的都应该看得懂,没什么可说的usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Animation;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;namespaceRomeClockControlLibrary{//////罗马时钟///publicpartialclassRomeClockControl:UserControl,IDisposable{publicRomeClockControl(){InitializeComponent();}//////x轴的中心位置///privatedoubleCenterPixToX=>this.ActualWidth/2;//////y轴的中心位置///privatedoubleCenterPixToY=>this.ActualHeight/2;//////秒///privateCanvasCanvasHour=null;//////分///privateCanvasCanvasMinute=null;//////时///privateCanvasCanvasSecond=null;//////UI更新线程///privateThreadthread=null;//////缓存时的显示控件///privateTextBlockBlockHour=null;//////缓存分的显示控件///privateTextBlockBlockMinute=null;//////缓存秒的显示控件///privateTextBlockBlockSecond=null;//////添加控件///privatevoidAdd(AddTypetype){varoffset=0;//偏移量varcount=0;//总量varstr=string.Empty;vartime=0;doubleAngleTime=0;Canvascanvas=newCanvas();canvas.Tag=type;switch(type){caseAddType.Hour:offset=95;count=24;str="时";CanvasHour=canvas;time=DateTime.Now.Hour;break;caseAddType.Minute:offset=60;count=60;str="分";CanvasMinute=canvas;time=DateTime.Now.Minute;break;caseAddType.Second:offset=30;count=60;str="秒";CanvasSecond=canvas;time=DateTime.Now.Second;break;default:return;}varangle=360/count;//角度varx=CenterPixToX-offset;//起始位置vary=CenterPixToY-offset;for(inti=0;i{TextBlockt=newTextBlock();if(i<=9){t.Text=$"0{i}{str}";}else{t.Text=$"{i}{str}";}t.Tag=i;t.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));canvas.Children.Add(t);varsinv=Math.Sin((90-angle*i)*(Math.PI/180));varcosv=Math.Cos((90-angle*i)*(Math.PI/180));vara=CenterPixToY-y*sinv;varb=CenterPixToX+y*cosv;Canvas.SetLeft(t,b);Canvas.SetTop(t,a);//设置角度RotateTransformr=newRotateTransform();r.Angle=angle*i-90;t.RenderTransform=r;if(i==time){AngleTime=360-r.Angle;//更新样式t.Foreground=newSolidColorBrush(Colors.White);switch(type){caseAddType.Hour:BlockHour=t;break;caseAddType.Minute:BlockMinute=t;break;caseAddType.Second:BlockSecond=t;break;}}}grid.Children.Add(canvas);//获取当前时间,旋转对应的角度RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=AngleTime;canvas.RenderTransform=rtf;}//////渲染时钟///publicvoidShow(){Dispose();//设置圆角bor.CornerRadius=newCornerRadius(this.ActualWidth/2);Add(AddType.Hour);Add(AddType.Minute);Add(AddType.Second);AddName();thread=newThread(newThreadStart(threadMethod));thread.IsBackground=true;thread.Start();}//////生成名称///privatevoidAddName(){TextBlocktb=newTextBlock();tb.Text="XL";tb.Foreground=newSolidColorBrush(Colors.White);tb.FontSize=60;tb.FontFamily=newFontFamily("华文琥珀");tb.HorizontalAlignment=HorizontalAlignment.Center;tb.VerticalAlignment=VerticalAlignment.Center;grid.Children.Add(tb);}//////UI更新线程///privatevoidthreadMethod(){while(true){Dispatcher.Invoke(()=>{vars=DateTime.Now.Second;varm=DateTime.Now.Minute;varh=DateTime.Now.Hour;//处理时if(m==0&&(int)BlockHour.Tag!=h){SetUI(CanvasHour,h);}//处理分if(s==0&&(int)BlockMinute.Tag!=m){SetUI(CanvasMinute,m);}//处理秒SetUI(CanvasSecond,s);});Thread.Sleep(1000);}}//////更新UI////////////privatevoidSetUI(Canvascan,inttag){vartype=(AddType)can.Tag;foreach(TextBlockitemincan.Children){if((int)item.Tag==tag){Debug.WriteLine(item.Text);varfr=item.RenderTransformasRotateTransform;varangle=360-fr.Angle;varrtf=can.RenderTransformasRotateTransform;DoubleAnimationdb=null;if(type==AddType.Minute){angle-=360;db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1)));db.Completed+=DbMinute_Completed;BlockMinute=item;}elseif(type==AddType.Hour){angle+=360;db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1.5)));db.Completed+=DbHour_Completed;BlockHour=item;}else{db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(0.25)));db.Completed+=DbSecond_Completed;BlockSecond=item;}rtf.BeginAnimation(RotateTransform.AngleProperty,db);}else{item.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));}}}//////秒动画完成时/////////privatevoidDbSecond_Completed(objectsender,EventArgse){BlockSecond.Foreground=newSolidColorBrush(Colors.White);}//////时动画完成时/////////privatevoidDbHour_Completed(objectsender,EventArgse){varfr=CanvasHour.RenderTransformasRotateTransform;varangle=fr.Angle-360;fr=null;RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=angle;CanvasHour.RenderTransform=rtf;Debug.WriteLine(rtf.Angle);BlockHour.Foreground=newSolidColorBrush(Colors.White);}//////分动画完成时/////////privatevoidDbMinute_Completed(objectsender,EventArgse){varfr=CanvasMinute.RenderTransformasRotateTransform;varangle=fr.Angle+360;fr=null;RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=angle;CanvasMinute.RenderTransform=rtf;Debug.WriteLine(rtf.Angle);BlockMinute.Foreground=newSolidColorBrush(Colors.White);}//////释放///publicvoidDispose(){thread?.Abort();grid.Children.Clear();}}//////添加类型///publicenumAddType{Hour,Minute,Second}} 上面是后端逻辑,这才是重点,调用者通过show,调用显示的;在show里面会开启一个后台处理线程,来实现获取当前时间,并计算需要旋转的角度,最后采用动画更新到UI! 整个流程就是这样,有疑问的朋友,欢迎留言!下载地址,附源码==》 点我前往支持原创,转载请标明出处,谢谢!
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:RomeClockControlLibrary"
mc:Ignorable="d"
d:DesignHeight="450"
d:DesignWidth="800"
>
Background="#000000">上面是前端代码,有点基础的都应该看得懂,没什么可说的usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnostics;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Animation;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;namespaceRomeClockControlLibrary{//////罗马时钟///publicpartialclassRomeClockControl:UserControl,IDisposable{publicRomeClockControl(){InitializeComponent();}//////x轴的中心位置///privatedoubleCenterPixToX=>this.ActualWidth/2;//////y轴的中心位置///privatedoubleCenterPixToY=>this.ActualHeight/2;//////秒///privateCanvasCanvasHour=null;//////分///privateCanvasCanvasMinute=null;//////时///privateCanvasCanvasSecond=null;//////UI更新线程///privateThreadthread=null;//////缓存时的显示控件///privateTextBlockBlockHour=null;//////缓存分的显示控件///privateTextBlockBlockMinute=null;//////缓存秒的显示控件///privateTextBlockBlockSecond=null;//////添加控件///privatevoidAdd(AddTypetype){varoffset=0;//偏移量varcount=0;//总量varstr=string.Empty;vartime=0;doubleAngleTime=0;Canvascanvas=newCanvas();canvas.Tag=type;switch(type){caseAddType.Hour:offset=95;count=24;str="时";CanvasHour=canvas;time=DateTime.Now.Hour;break;caseAddType.Minute:offset=60;count=60;str="分";CanvasMinute=canvas;time=DateTime.Now.Minute;break;caseAddType.Second:offset=30;count=60;str="秒";CanvasSecond=canvas;time=DateTime.Now.Second;break;default:return;}varangle=360/count;//角度varx=CenterPixToX-offset;//起始位置vary=CenterPixToY-offset;for(inti=0;i{TextBlockt=newTextBlock();if(i<=9){t.Text=$"0{i}{str}";}else{t.Text=$"{i}{str}";}t.Tag=i;t.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));canvas.Children.Add(t);varsinv=Math.Sin((90-angle*i)*(Math.PI/180));varcosv=Math.Cos((90-angle*i)*(Math.PI/180));vara=CenterPixToY-y*sinv;varb=CenterPixToX+y*cosv;Canvas.SetLeft(t,b);Canvas.SetTop(t,a);//设置角度RotateTransformr=newRotateTransform();r.Angle=angle*i-90;t.RenderTransform=r;if(i==time){AngleTime=360-r.Angle;//更新样式t.Foreground=newSolidColorBrush(Colors.White);switch(type){caseAddType.Hour:BlockHour=t;break;caseAddType.Minute:BlockMinute=t;break;caseAddType.Second:BlockSecond=t;break;}}}grid.Children.Add(canvas);//获取当前时间,旋转对应的角度RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=AngleTime;canvas.RenderTransform=rtf;}//////渲染时钟///publicvoidShow(){Dispose();//设置圆角bor.CornerRadius=newCornerRadius(this.ActualWidth/2);Add(AddType.Hour);Add(AddType.Minute);Add(AddType.Second);AddName();thread=newThread(newThreadStart(threadMethod));thread.IsBackground=true;thread.Start();}//////生成名称///privatevoidAddName(){TextBlocktb=newTextBlock();tb.Text="XL";tb.Foreground=newSolidColorBrush(Colors.White);tb.FontSize=60;tb.FontFamily=newFontFamily("华文琥珀");tb.HorizontalAlignment=HorizontalAlignment.Center;tb.VerticalAlignment=VerticalAlignment.Center;grid.Children.Add(tb);}//////UI更新线程///privatevoidthreadMethod(){while(true){Dispatcher.Invoke(()=>{vars=DateTime.Now.Second;varm=DateTime.Now.Minute;varh=DateTime.Now.Hour;//处理时if(m==0&&(int)BlockHour.Tag!=h){SetUI(CanvasHour,h);}//处理分if(s==0&&(int)BlockMinute.Tag!=m){SetUI(CanvasMinute,m);}//处理秒SetUI(CanvasSecond,s);});Thread.Sleep(1000);}}//////更新UI////////////privatevoidSetUI(Canvascan,inttag){vartype=(AddType)can.Tag;foreach(TextBlockitemincan.Children){if((int)item.Tag==tag){Debug.WriteLine(item.Text);varfr=item.RenderTransformasRotateTransform;varangle=360-fr.Angle;varrtf=can.RenderTransformasRotateTransform;DoubleAnimationdb=null;if(type==AddType.Minute){angle-=360;db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1)));db.Completed+=DbMinute_Completed;BlockMinute=item;}elseif(type==AddType.Hour){angle+=360;db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1.5)));db.Completed+=DbHour_Completed;BlockHour=item;}else{db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(0.25)));db.Completed+=DbSecond_Completed;BlockSecond=item;}rtf.BeginAnimation(RotateTransform.AngleProperty,db);}else{item.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));}}}//////秒动画完成时/////////privatevoidDbSecond_Completed(objectsender,EventArgse){BlockSecond.Foreground=newSolidColorBrush(Colors.White);}//////时动画完成时/////////privatevoidDbHour_Completed(objectsender,EventArgse){varfr=CanvasHour.RenderTransformasRotateTransform;varangle=fr.Angle-360;fr=null;RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=angle;CanvasHour.RenderTransform=rtf;Debug.WriteLine(rtf.Angle);BlockHour.Foreground=newSolidColorBrush(Colors.White);}//////分动画完成时/////////privatevoidDbMinute_Completed(objectsender,EventArgse){varfr=CanvasMinute.RenderTransformasRotateTransform;varangle=fr.Angle+360;fr=null;RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=angle;CanvasMinute.RenderTransform=rtf;Debug.WriteLine(rtf.Angle);BlockMinute.Foreground=newSolidColorBrush(Colors.White);}//////释放///publicvoidDispose(){thread?.Abort();grid.Children.Clear();}}//////添加类型///publicenumAddType{Hour,Minute,Second}} 上面是后端逻辑,这才是重点,调用者通过show,调用显示的;在show里面会开启一个后台处理线程,来实现获取当前时间,并计算需要旋转的角度,最后采用动画更新到UI! 整个流程就是这样,有疑问的朋友,欢迎留言!下载地址,附源码==》 点我前往支持原创,转载请标明出处,谢谢!
Background="#000000"
上面是前端代码,有点基础的都应该看得懂,没什么可说的
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Diagnostics;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Threading.Tasks;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Data;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Animation;
usingSystem.Windows.Media.Imaging;
usingSystem.Windows.Navigation;
usingSystem.Windows.Shapes;
namespaceRomeClockControlLibrary
{
///
///罗马时钟
publicpartialclassRomeClockControl:UserControl,IDisposable
publicRomeClockControl()
InitializeComponent();
}
///x轴的中心位置
privatedoubleCenterPixToX=>this.ActualWidth/2;
///y轴的中心位置
privatedoubleCenterPixToY=>this.ActualHeight/2;
///秒
privateCanvasCanvasHour=null;
///分
privateCanvasCanvasMinute=null;
///时
privateCanvasCanvasSecond=null;
///UI更新线程
privateThreadthread=null;
///缓存时的显示控件
privateTextBlockBlockHour=null;
///缓存分的显示控件
privateTextBlockBlockMinute=null;
///缓存秒的显示控件
privateTextBlockBlockSecond=null;
///添加控件
privatevoidAdd(AddTypetype)
varoffset=0;//偏移量
varcount=0;//总量
varstr=string.Empty;
vartime=0;
doubleAngleTime=0;
Canvascanvas=newCanvas();
canvas.Tag=type;
switch(type)
caseAddType.Hour:
offset=95;
count=24;
str="时";
CanvasHour=canvas;
time=DateTime.Now.Hour;
break;
caseAddType.Minute:
offset=60;
count=60;
str="分";
CanvasMinute=canvas;
time=DateTime.Now.Minute;
caseAddType.Second:
offset=30;
str="秒";
CanvasSecond=canvas;
time=DateTime.Now.Second;
default:
return;
varangle=360/count;//角度
varx=CenterPixToX-offset;//起始位置
vary=CenterPixToY-offset;
for(inti=0;i{TextBlockt=newTextBlock();if(i<=9){t.Text=$"0{i}{str}";}else{t.Text=$"{i}{str}";}t.Tag=i;t.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));canvas.Children.Add(t);varsinv=Math.Sin((90-angle*i)*(Math.PI/180));varcosv=Math.Cos((90-angle*i)*(Math.PI/180));vara=CenterPixToY-y*sinv;varb=CenterPixToX+y*cosv;Canvas.SetLeft(t,b);Canvas.SetTop(t,a);//设置角度RotateTransformr=newRotateTransform();r.Angle=angle*i-90;t.RenderTransform=r;if(i==time){AngleTime=360-r.Angle;//更新样式t.Foreground=newSolidColorBrush(Colors.White);switch(type){caseAddType.Hour:BlockHour=t;break;caseAddType.Minute:BlockMinute=t;break;caseAddType.Second:BlockSecond=t;break;}}}grid.Children.Add(canvas);//获取当前时间,旋转对应的角度RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=AngleTime;canvas.RenderTransform=rtf;}//////渲染时钟///publicvoidShow(){Dispose();//设置圆角bor.CornerRadius=newCornerRadius(this.ActualWidth/2);Add(AddType.Hour);Add(AddType.Minute);Add(AddType.Second);AddName();thread=newThread(newThreadStart(threadMethod));thread.IsBackground=true;thread.Start();}//////生成名称///privatevoidAddName(){TextBlocktb=newTextBlock();tb.Text="XL";tb.Foreground=newSolidColorBrush(Colors.White);tb.FontSize=60;tb.FontFamily=newFontFamily("华文琥珀");tb.HorizontalAlignment=HorizontalAlignment.Center;tb.VerticalAlignment=VerticalAlignment.Center;grid.Children.Add(tb);}//////UI更新线程///privatevoidthreadMethod(){while(true){Dispatcher.Invoke(()=>{vars=DateTime.Now.Second;varm=DateTime.Now.Minute;varh=DateTime.Now.Hour;//处理时if(m==0&&(int)BlockHour.Tag!=h){SetUI(CanvasHour,h);}//处理分if(s==0&&(int)BlockMinute.Tag!=m){SetUI(CanvasMinute,m);}//处理秒SetUI(CanvasSecond,s);});Thread.Sleep(1000);}}//////更新UI////////////privatevoidSetUI(Canvascan,inttag){vartype=(AddType)can.Tag;foreach(TextBlockitemincan.Children){if((int)item.Tag==tag){Debug.WriteLine(item.Text);varfr=item.RenderTransformasRotateTransform;varangle=360-fr.Angle;varrtf=can.RenderTransformasRotateTransform;DoubleAnimationdb=null;if(type==AddType.Minute){angle-=360;db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1)));db.Completed+=DbMinute_Completed;BlockMinute=item;}elseif(type==AddType.Hour){angle+=360;db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1.5)));db.Completed+=DbHour_Completed;BlockHour=item;}else{db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(0.25)));db.Completed+=DbSecond_Completed;BlockSecond=item;}rtf.BeginAnimation(RotateTransform.AngleProperty,db);}else{item.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));}}}//////秒动画完成时/////////privatevoidDbSecond_Completed(objectsender,EventArgse){BlockSecond.Foreground=newSolidColorBrush(Colors.White);}//////时动画完成时/////////privatevoidDbHour_Completed(objectsender,EventArgse){varfr=CanvasHour.RenderTransformasRotateTransform;varangle=fr.Angle-360;fr=null;RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=angle;CanvasHour.RenderTransform=rtf;Debug.WriteLine(rtf.Angle);BlockHour.Foreground=newSolidColorBrush(Colors.White);}//////分动画完成时/////////privatevoidDbMinute_Completed(objectsender,EventArgse){varfr=CanvasMinute.RenderTransformasRotateTransform;varangle=fr.Angle+360;fr=null;RotateTransformrtf=newRotateTransform();rtf.CenterX=CenterPixToX;rtf.CenterY=CenterPixToY;rtf.Angle=angle;CanvasMinute.RenderTransform=rtf;Debug.WriteLine(rtf.Angle);BlockMinute.Foreground=newSolidColorBrush(Colors.White);}//////释放///publicvoidDispose(){thread?.Abort();grid.Children.Clear();}}//////添加类型///publicenumAddType{Hour,Minute,Second}} 上面是后端逻辑,这才是重点,调用者通过show,调用显示的;在show里面会开启一个后台处理线程,来实现获取当前时间,并计算需要旋转的角度,最后采用动画更新到UI! 整个流程就是这样,有疑问的朋友,欢迎留言!下载地址,附源码==》 点我前往支持原创,转载请标明出处,谢谢!
TextBlockt=newTextBlock();
if(i<=9)
t.Text=$"0{i}{str}";
else
t.Text=$"{i}{str}";
t.Tag=i;
t.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));
canvas.Children.Add(t);
varsinv=Math.Sin((90-angle*i)*(Math.PI/180));
varcosv=Math.Cos((90-angle*i)*(Math.PI/180));
vara=CenterPixToY-y*sinv;
varb=CenterPixToX+y*cosv;
Canvas.SetLeft(t,b);
Canvas.SetTop(t,a);
//设置角度
RotateTransformr=newRotateTransform();
r.Angle=angle*i-90;
t.RenderTransform=r;
if(i==time)
AngleTime=360-r.Angle;
//更新样式
t.Foreground=newSolidColorBrush(Colors.White);
BlockHour=t;
BlockMinute=t;
BlockSecond=t;
grid.Children.Add(canvas);
//获取当前时间,旋转对应的角度
RotateTransformrtf=newRotateTransform();
rtf.CenterX=CenterPixToX;
rtf.CenterY=CenterPixToY;
rtf.Angle=AngleTime;
canvas.RenderTransform=rtf;
///渲染时钟
publicvoidShow()
Dispose();
//设置圆角
bor.CornerRadius=newCornerRadius(this.ActualWidth/2);
Add(AddType.Hour);
Add(AddType.Minute);
Add(AddType.Second);
AddName();
thread=newThread(newThreadStart(threadMethod));
thread.IsBackground=true;
thread.Start();
///生成名称
privatevoidAddName()
TextBlocktb=newTextBlock();
tb.Text="XL";
tb.Foreground=newSolidColorBrush(Colors.White);
tb.FontSize=60;
tb.FontFamily=newFontFamily("华文琥珀");
tb.HorizontalAlignment=HorizontalAlignment.Center;
tb.VerticalAlignment=VerticalAlignment.Center;
grid.Children.Add(tb);
privatevoidthreadMethod()
while(true)
Dispatcher.Invoke(()=>
vars=DateTime.Now.Second;
varm=DateTime.Now.Minute;
varh=DateTime.Now.Hour;
//处理时
if(m==0&&(int)BlockHour.Tag!=h)
SetUI(CanvasHour,h);
//处理分
if(s==0&&(int)BlockMinute.Tag!=m)
SetUI(CanvasMinute,m);
//处理秒
SetUI(CanvasSecond,s);
});
Thread.Sleep(1000);
///更新UI
privatevoidSetUI(Canvascan,inttag)
vartype=(AddType)can.Tag;
foreach(TextBlockitemincan.Children)
if((int)item.Tag==tag)
Debug.WriteLine(item.Text);
varfr=item.RenderTransformasRotateTransform;
varangle=360-fr.Angle;
varrtf=can.RenderTransformasRotateTransform;
DoubleAnimationdb=null;
if(type==AddType.Minute)
angle-=360;
db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1)));
db.Completed+=DbMinute_Completed;
BlockMinute=item;
elseif(type==AddType.Hour)
angle+=360;
db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1.5)));
db.Completed+=DbHour_Completed;
BlockHour=item;
db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(0.25)));
db.Completed+=DbSecond_Completed;
BlockSecond=item;
rtf.BeginAnimation(RotateTransform.AngleProperty,db);
item.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));
///秒动画完成时
privatevoidDbSecond_Completed(objectsender,EventArgse)
BlockSecond.Foreground=newSolidColorBrush(Colors.White);
///时动画完成时
privatevoidDbHour_Completed(objectsender,EventArgse)
varfr=CanvasHour.RenderTransformasRotateTransform;
varangle=fr.Angle-360;
fr=null;
rtf.Angle=angle;
CanvasHour.RenderTransform=rtf;
Debug.WriteLine(rtf.Angle);
BlockHour.Foreground=newSolidColorBrush(Colors.White);
///分动画完成时
privatevoidDbMinute_Completed(objectsender,EventArgse)
varfr=CanvasMinute.RenderTransformasRotateTransform;
varangle=fr.Angle+360;
CanvasMinute.RenderTransform=rtf;
BlockMinute.Foreground=newSolidColorBrush(Colors.White);
///释放
publicvoidDispose()
thread?.Abort();
grid.Children.Clear();
///添加类型
publicenumAddType
Hour,
Minute,
Second
上面是后端逻辑,这才是重点,调用者通过show,调用显示的;在show里面会开启一个后台处理线程,来实现获取当前时间,并计算需要旋转的角度,最后采用动画更新到UI!
整个流程就是这样,有疑问的朋友,欢迎留言!
下载地址,附源码==》 点我前往
支持原创,转载请标明出处,谢谢!
乐意黎最近在某音上看到Wordclock屏保非常的火爆,看上去非常有意思。
哪么Wordclock屏保怎么弄的?如何设置呢?
电脑怎么设置动态时钟屏保
实现这样的动态时间屏保的效果主要是使用了一款叫做wordclock的第三方插件,《WordClock》时钟是一个纯文字排版的屏幕保护程序,可以在MacOSX和Windows上使用。它显示一个固定的名单,包括时钟显示所需要的数字和文字,足以表达任何可能的日期和时间。
请自行搜索并下载 wordclock,并下载 软件。
参考网址: https://www.simonheys.com/wordclock/ (需付费)
wordclock怎么设置
下载后解压安装
安装之后,找到Windows的屏保设置
选择Wordclock,并点击设置
字体和样式设置,一共有直线、旋转、随机三种样式
字体排版设置,小编为大家整出了直译,方便大家选择
显示设置,样式的调整
设置完成,即可出现抖音上的效果
乐意黎
2019-04-05
选对培训机构比较重要,还有就是选择的时候看一下自己适合哪种风格的讲课方式,这个也很重要。因为现在5G时代来临,人工智能绝对是一个发展的大趋势,如果你自己空余时间又比较多的话,其实可以报一个辅导班,学习学习一些基本的东西,毕竟多学点总是没有坏处...
深度学习是近几年人工智能领域的主要研究方向。深度学习的主要任务是通过构建深度卷积神经网络(Deep Neural Network,DNN)和采用大量样本数据作为输入,人们最终会得到一个具有强大分析能力和识别能力的模型,该模型包含了DNN的构成参数以应用于实际工作。...
AI深度学习课程是用于建立、模拟人脑进行分析学习的神经网络,并模仿人脑的机制来解释数据的一种机器学习技术,主要应用于图像识别、语音识别、自然语言处理等领域。学完可以从事深度学习工程师、机器学习工程师、人工智能工程师、高级算法工程师、高级算法工...
算法,数据相关的适合做人工智能
人工智能取代的行业,一定有如下几个特征:1、大量重复型。2、逻辑性比较强。3、数据库依赖型。像司机,咨询,教育,医生,会计,律师助理,工程师,码农等,都是容易被取代的行业。当然,这都是强人工智能以后会发生的事,现在还是弱人工智能的时代,想进入...
如果你是自己学着玩,提升自己的话,高中毕业都可以。如果是冲着AI算法岗或者科研一席之地,至少211硕士。具体可以亲身体验一下今年算法岗秋招。
可以,未来的人工智能发展深度学习必然是现在大型机器生产科研必备的,证书的话某个培训好像有这个中科院的证书,具体你去百度吧
我觉得就是人工智能的课程,现在家具都是智能家居了。这一块发展一定很好
对于sgd算法而言,batch size太大太小都不好,太小的话训练不稳定,计算效率低;太大的话收敛速度慢,需要仔细调节一下。以2的倍数调节,例如32,64,128等
在terminal中输入$wolf@wolf:~/Downloads/gitclonehttps://github.com/Tencent/ncnn cd切换到NCNN目录***这步很重要,这时候需要修改ncnn的root目录下的CMakeLists.txt文件,需要将倒数几行的add_subdirectory(examples),取消注释,这样就是默认编译example...
人工智能的话其实到现在来说已经慢慢趋于成熟,学的话首先是一线城市,学出来好就业,还有就是薪资也高
画个train and test error VS 训练数据量(training set size) 的learningcurve应该会更加直观了。可以找个简单的数据集,比如说handwritten digits或者什么的,分别用神经网络和决策树或者knn做出这个learningcurve。你会看到如果用一个决策树去解决这个问题...
共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。 一幅图象的灰度共生矩阵能反映出图象灰度关于...
最多设置5个标签!
wpf模拟抖音很火的罗盘时钟,附源码,解压就能跑
前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~ 错错错,黑底白字的罗盘时钟!
作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf,写个属于.net自己的罗盘时钟,目前只实现了时分秒,农历日期等逻辑都是一样的,所以就略了,有兴趣的朋友,可以继续深入!
最开始想直接弄成成exe,方便拷贝,到处运行使用的,但是考虑到,万一有网友朋友们需要,所以我还是把封成一个dll,需要的地方添加引用即可!
为了弄这个,还恶补了下,高中还是初中的知识,sin30,cos60,呵呵,正弦,余弦,所以不明白的朋友们需要先了解清楚这个,因为罗盘是旋转,需要用到计算这个值!
不废话了,先上图看下效果!
ok,整体效果就是这样了,中间是鄙人的名称缩写,抖音上是很潦草的,我就随便啦,占个位置,不然显得很空洞!
下面说说代码
主要是,RomeClockControlLibrary,这个是对控件的封装,上面那个启动程序只是一个容器,或者说是调用者,当然,如果要达到我这个效果,实现圆形的窗口透明的朋友们,可以看下借鉴!
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:RomeClockControlLibrary"
mc:Ignorable="d"
d:DesignHeight="450"
d:DesignWidth="800"
>
Background="#000000"
>
上面是前端代码,有点基础的都应该看得懂,没什么可说的
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Diagnostics;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Threading.Tasks;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Data;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Animation;
usingSystem.Windows.Media.Imaging;
usingSystem.Windows.Navigation;
usingSystem.Windows.Shapes;
namespaceRomeClockControlLibrary
{
///
///罗马时钟
///
publicpartialclassRomeClockControl:UserControl,IDisposable
{
publicRomeClockControl()
{
InitializeComponent();
}
///
///x轴的中心位置
///
privatedoubleCenterPixToX=>this.ActualWidth/2;
///
///y轴的中心位置
///
privatedoubleCenterPixToY=>this.ActualHeight/2;
///
///秒
///
privateCanvasCanvasHour=null;
///
///分
///
privateCanvasCanvasMinute=null;
///
///时
///
privateCanvasCanvasSecond=null;
///
///UI更新线程
///
privateThreadthread=null;
///
///缓存时的显示控件
///
privateTextBlockBlockHour=null;
///
///缓存分的显示控件
///
privateTextBlockBlockMinute=null;
///
///缓存秒的显示控件
///
privateTextBlockBlockSecond=null;
///
///添加控件
///
privatevoidAdd(AddTypetype)
{
varoffset=0;//偏移量
varcount=0;//总量
varstr=string.Empty;
vartime=0;
doubleAngleTime=0;
Canvascanvas=newCanvas();
canvas.Tag=type;
switch(type)
{
caseAddType.Hour:
offset=95;
count=24;
str="时";
CanvasHour=canvas;
time=DateTime.Now.Hour;
break;
caseAddType.Minute:
offset=60;
count=60;
str="分";
CanvasMinute=canvas;
time=DateTime.Now.Minute;
break;
caseAddType.Second:
offset=30;
count=60;
str="秒";
CanvasSecond=canvas;
time=DateTime.Now.Second;
break;
default:
return;
}
varangle=360/count;//角度
varx=CenterPixToX-offset;//起始位置
vary=CenterPixToY-offset;
for(inti=0;i
{
TextBlockt=newTextBlock();
if(i<=9)
{
t.Text=$"0{i}{str}";
}
else
{
t.Text=$"{i}{str}";
}
t.Tag=i;
t.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));
canvas.Children.Add(t);
varsinv=Math.Sin((90-angle*i)*(Math.PI/180));
varcosv=Math.Cos((90-angle*i)*(Math.PI/180));
vara=CenterPixToY-y*sinv;
varb=CenterPixToX+y*cosv;
Canvas.SetLeft(t,b);
Canvas.SetTop(t,a);
//设置角度
RotateTransformr=newRotateTransform();
r.Angle=angle*i-90;
t.RenderTransform=r;
if(i==time)
{
AngleTime=360-r.Angle;
//更新样式
t.Foreground=newSolidColorBrush(Colors.White);
switch(type)
{
caseAddType.Hour:
BlockHour=t;
break;
caseAddType.Minute:
BlockMinute=t;
break;
caseAddType.Second:
BlockSecond=t;
break;
}
}
}
grid.Children.Add(canvas);
//获取当前时间,旋转对应的角度
RotateTransformrtf=newRotateTransform();
rtf.CenterX=CenterPixToX;
rtf.CenterY=CenterPixToY;
rtf.Angle=AngleTime;
canvas.RenderTransform=rtf;
}
///
///渲染时钟
///
publicvoidShow()
{
Dispose();
//设置圆角
bor.CornerRadius=newCornerRadius(this.ActualWidth/2);
Add(AddType.Hour);
Add(AddType.Minute);
Add(AddType.Second);
AddName();
thread=newThread(newThreadStart(threadMethod));
thread.IsBackground=true;
thread.Start();
}
///
///生成名称
///
privatevoidAddName()
{
TextBlocktb=newTextBlock();
tb.Text="XL";
tb.Foreground=newSolidColorBrush(Colors.White);
tb.FontSize=60;
tb.FontFamily=newFontFamily("华文琥珀");
tb.HorizontalAlignment=HorizontalAlignment.Center;
tb.VerticalAlignment=VerticalAlignment.Center;
grid.Children.Add(tb);
}
///
///UI更新线程
///
privatevoidthreadMethod()
{
while(true)
{
Dispatcher.Invoke(()=>
{
vars=DateTime.Now.Second;
varm=DateTime.Now.Minute;
varh=DateTime.Now.Hour;
//处理时
if(m==0&&(int)BlockHour.Tag!=h)
{
SetUI(CanvasHour,h);
}
//处理分
if(s==0&&(int)BlockMinute.Tag!=m)
{
SetUI(CanvasMinute,m);
}
//处理秒
SetUI(CanvasSecond,s);
});
Thread.Sleep(1000);
}
}
///
///更新UI
///
///
///
///
privatevoidSetUI(Canvascan,inttag)
{
vartype=(AddType)can.Tag;
foreach(TextBlockitemincan.Children)
{
if((int)item.Tag==tag)
{
Debug.WriteLine(item.Text);
varfr=item.RenderTransformasRotateTransform;
varangle=360-fr.Angle;
varrtf=can.RenderTransformasRotateTransform;
DoubleAnimationdb=null;
if(type==AddType.Minute)
{
angle-=360;
db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1)));
db.Completed+=DbMinute_Completed;
BlockMinute=item;
}
elseif(type==AddType.Hour)
{
angle+=360;
db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(1.5)));
db.Completed+=DbHour_Completed;
BlockHour=item;
}
else
{
db=newDoubleAnimation(angle,newDuration(TimeSpan.FromSeconds(0.25)));
db.Completed+=DbSecond_Completed;
BlockSecond=item;
}
rtf.BeginAnimation(RotateTransform.AngleProperty,db);
}
else
{
item.Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#7d7d7d"));
}
}
}
///
///秒动画完成时
///
///
///
privatevoidDbSecond_Completed(objectsender,EventArgse)
{
BlockSecond.Foreground=newSolidColorBrush(Colors.White);
}
///
///时动画完成时
///
///
///
privatevoidDbHour_Completed(objectsender,EventArgse)
{
varfr=CanvasHour.RenderTransformasRotateTransform;
varangle=fr.Angle-360;
fr=null;
RotateTransformrtf=newRotateTransform();
rtf.CenterX=CenterPixToX;
rtf.CenterY=CenterPixToY;
rtf.Angle=angle;
CanvasHour.RenderTransform=rtf;
Debug.WriteLine(rtf.Angle);
BlockHour.Foreground=newSolidColorBrush(Colors.White);
}
///
///分动画完成时
///
///
///
privatevoidDbMinute_Completed(objectsender,EventArgse)
{
varfr=CanvasMinute.RenderTransformasRotateTransform;
varangle=fr.Angle+360;
fr=null;
RotateTransformrtf=newRotateTransform();
rtf.CenterX=CenterPixToX;
rtf.CenterY=CenterPixToY;
rtf.Angle=angle;
CanvasMinute.RenderTransform=rtf;
Debug.WriteLine(rtf.Angle);
BlockMinute.Foreground=newSolidColorBrush(Colors.White);
}
///
///释放
///
publicvoidDispose()
{
thread?.Abort();
grid.Children.Clear();
}
}
///
///添加类型
///
publicenumAddType
{
Hour,
Minute,
Second
}
}
上面是后端逻辑,这才是重点,调用者通过show,调用显示的;在show里面会开启一个后台处理线程,来实现获取当前时间,并计算需要旋转的角度,最后采用动画更新到UI!
整个流程就是这样,有疑问的朋友,欢迎留言!
下载地址,附源码==》 点我前往
支持原创,转载请标明出处,谢谢!
乐意黎最近在某音上看到Wordclock屏保非常的火爆,看上去非常有意思。
哪么Wordclock屏保怎么弄的?如何设置呢?
电脑怎么设置动态时钟屏保
实现这样的动态时间屏保的效果主要是使用了一款叫做wordclock的第三方插件,《WordClock》时钟是一个纯文字排版的屏幕保护程序,可以在MacOSX和Windows上使用。它显示一个固定的名单,包括时钟显示所需要的数字和文字,足以表达任何可能的日期和时间。
请自行搜索并下载 wordclock,并下载 软件。
参考网址: https://www.simonheys.com/wordclock/ (需付费)
wordclock怎么设置
下载后解压安装
安装之后,找到Windows的屏保设置
选择Wordclock,并点击设置
字体和样式设置,一共有直线、旋转、随机三种样式
字体排版设置,小编为大家整出了直译,方便大家选择
显示设置,样式的调整
设置完成,即可出现抖音上的效果
乐意黎
2019-04-05
相关问题推荐
选对培训机构比较重要,还有就是选择的时候看一下自己适合哪种风格的讲课方式,这个也很重要。因为现在5G时代来临,人工智能绝对是一个发展的大趋势,如果你自己空余时间又比较多的话,其实可以报一个辅导班,学习学习一些基本的东西,毕竟多学点总是没有坏处...
深度学习是近几年人工智能领域的主要研究方向。深度学习的主要任务是通过构建深度卷积神经网络(Deep Neural Network,DNN)和采用大量样本数据作为输入,人们最终会得到一个具有强大分析能力和识别能力的模型,该模型包含了DNN的构成参数以应用于实际工作。...
AI深度学习课程是用于建立、模拟人脑进行分析学习的神经网络,并模仿人脑的机制来解释数据的一种机器学习技术,主要应用于图像识别、语音识别、自然语言处理等领域。学完可以从事深度学习工程师、机器学习工程师、人工智能工程师、高级算法工程师、高级算法工...
算法,数据相关的适合做人工智能
人工智能取代的行业,一定有如下几个特征:1、大量重复型。2、逻辑性比较强。3、数据库依赖型。像司机,咨询,教育,医生,会计,律师助理,工程师,码农等,都是容易被取代的行业。当然,这都是强人工智能以后会发生的事,现在还是弱人工智能的时代,想进入...
如果你是自己学着玩,提升自己的话,高中毕业都可以。如果是冲着AI算法岗或者科研一席之地,至少211硕士。具体可以亲身体验一下今年算法岗秋招。
可以,未来的人工智能发展深度学习必然是现在大型机器生产科研必备的,证书的话某个培训好像有这个中科院的证书,具体你去百度吧
我觉得就是人工智能的课程,现在家具都是智能家居了。这一块发展一定很好
对于sgd算法而言,batch size太大太小都不好,太小的话训练不稳定,计算效率低;太大的话收敛速度慢,需要仔细调节一下。以2的倍数调节,例如32,64,128等
在terminal中输入$wolf@wolf:~/Downloads/gitclonehttps://github.com/Tencent/ncnn cd切换到NCNN目录***这步很重要,这时候需要修改ncnn的root目录下的CMakeLists.txt文件,需要将倒数几行的add_subdirectory(examples),取消注释,这样就是默认编译example...
人工智能的话其实到现在来说已经慢慢趋于成熟,学的话首先是一线城市,学出来好就业,还有就是薪资也高
画个train and test error VS 训练数据量(training set size) 的learningcurve应该会更加直观了。可以找个简单的数据集,比如说handwritten digits或者什么的,分别用神经网络和决策树或者knn做出这个learningcurve。你会看到如果用一个决策树去解决这个问题...
共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。 一幅图象的灰度共生矩阵能反映出图象灰度关于...