抖音上很火的时钟效果是怎么弄出来的?

2020-03-26 11:45发布

2条回答
给你三个亿
2楼 · 2020-09-08 09:41


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!


  整个流程就是这样,有疑问的朋友,欢迎留言!


下载地址,附源码==》 点我前往


支持原创,转载请标明出处,谢谢!


 


ann
3楼 · 2020-10-14 09:14



 

乐意黎最近在某音上看到Wordclock屏保非常的火爆,看上去非常有意思。

哪么Wordclock屏保怎么弄的?如何设置呢?

 

电脑怎么设置动态时钟屏保

实现这样的动态时间屏保的效果主要是使用了一款叫做wordclock的第三方插件,《WordClock》时钟是一个纯文字排版的屏幕保护程序,可以在MacOSX和Windows上使用。它显示一个固定的名单,包括时钟显示所需要的数字和文字,足以表达任何可能的日期和时间。 

请自行搜索并下载  wordclock,并下载 软件。

参考网址:  https://www.simonheys.com/wordclock/ (需付费)

wordclock怎么设置

下载后解压安装


安装之后,找到Windows的屏保设置


选择Wordclock,并点击设置


字体和样式设置,一共有直线、旋转、随机三种样式


字体排版设置,小编为大家整出了直译,方便大家选择


显示设置,样式的调整


设置完成,即可出现抖音上的效果

 


 


乐意黎 

2019-04-05


相关问题推荐

  • 回答 20

    选对培训机构比较重要,还有就是选择的时候看一下自己适合哪种风格的讲课方式,这个也很重要。因为现在5G时代来临,人工智能绝对是一个发展的大趋势,如果你自己空余时间又比较多的话,其实可以报一个辅导班,学习学习一些基本的东西,毕竟多学点总是没有坏处...

  • 回答 3

    深度学习是近几年人工智能领域的主要研究方向。深度学习的主要任务是通过构建深度卷积神经网络(Deep Neural Network,DNN)和采用大量样本数据作为输入,人们最终会得到一个具有强大分析能力和识别能力的模型,该模型包含了DNN的构成参数以应用于实际工作。...

  • 回答 3

    AI深度学习课程是用于建立、模拟人脑进行分析学习的神经网络,并模仿人脑的机制来解释数据的一种机器学习技术,主要应用于图像识别、语音识别、自然语言处理等领域。学完可以从事深度学习工程师、机器学习工程师、人工智能工程师、高级算法工程师、高级算法工...

  • 回答 16

    算法,数据相关的适合做人工智能

  • 回答 28

    人工智能取代的行业,一定有如下几个特征:1、大量重复型。2、逻辑性比较强。3、数据库依赖型。像司机,咨询,教育,医生,会计,律师助理,工程师,码农等,都是容易被取代的行业。当然,这都是强人工智能以后会发生的事,现在还是弱人工智能的时代,想进入...

  • 回答 9

    如果你是自己学着玩,提升自己的话,高中毕业都可以。如果是冲着AI算法岗或者科研一席之地,至少211硕士。具体可以亲身体验一下今年算法岗秋招。

  • 回答 9

    可以,未来的人工智能发展深度学习必然是现在大型机器生产科研必备的,证书的话某个培训好像有这个中科院的证书,具体你去百度吧

  • 回答 8

    我觉得就是人工智能的课程,现在家具都是智能家居了。这一块发展一定很好

  • 回答 3

    对于sgd算法而言,batch size太大太小都不好,太小的话训练不稳定,计算效率低;太大的话收敛速度慢,需要仔细调节一下。以2的倍数调节,例如32,64,128等

  • 回答 1

    在terminal中输入$wolf@wolf:~/Downloads/gitclonehttps://github.com/Tencent/ncnn cd切换到NCNN目录***这步很重要,这时候需要修改ncnn的root目录下的CMakeLists.txt文件,需要将倒数几行的add_subdirectory(examples),取消注释,这样就是默认编译example...

  • 回答 5

    人工智能的话其实到现在来说已经慢慢趋于成熟,学的话首先是一线城市,学出来好就业,还有就是薪资也高

  • 回答 3

    画个train and test error VS 训练数据量(training set size) 的learningcurve应该会更加直观了。可以找个简单的数据集,比如说handwritten digits或者什么的,分别用神经网络和决策树或者knn做出这个learningcurve。你会看到如果用一个决策树去解决这个问题...

  • 回答 2

    共生矩阵用两个位置的象素的联合概率密度来定义,它不仅反映亮度的分布特性,也反映具有同样亮度或接近亮度的象素之间的位置分布特性,是有关图象亮度变化的二阶统计特征。它是定义一组纹理特征的基础。     一幅图象的灰度共生矩阵能反映出图象灰度关于...

没有解决我的问题,去提问