模擬實現時鐘效果,學習WPF動畫好例子,本文承接上文 C# WPF 時鐘動畫(1/2)。html
內容目錄github
時鐘實時展現系統本機時間
express
模擬時鐘c#
使用 .Net Core 3.1 建立名爲 「Clock」 的WPF解決方案,解決方案中須要添加時鐘背景圖片,圖片以下:https://github.com/Abel13/Clock/blob/master/Clock/Assets/clock.png微信
使用3個Border佈局時鐘的時針、分針、秒針,並給3個指針添加動畫,動畫說明以下:佈局
<Window x:Class="Clock.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Clock" mc:Ignorable="d" AllowsTransparency="True" WindowStyle="None" ResizeMode="NoResize" Height="520" Width="520" WindowStartupLocation="CenterScreen" Background="{x:Null}"> <Window.Resources> <Storyboard x:Key="sbseconds" RepeatBehavior="Forever"> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="second" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)"> <EasingDoubleKeyFrame KeyTime="0" Value="-90"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:1" Value="-84"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:2" Value="-78"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:3" Value="-72"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:4" Value="-66"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:5" Value="-60"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:6" Value="-54"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:7" Value="-48"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:8" Value="-42"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:9" Value="-36"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:10" Value="-30"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:11" Value="-24"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:12" Value="-18"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:13" Value="-12"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:14" Value="-6"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:15" Value="0"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:16" Value="6"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:17" Value="12"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:18" Value="18"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:19" Value="24"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:20" Value="30"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:21" Value="36"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:22" Value="42"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:23" Value="48"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:24" Value="54"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:25" Value="60"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:26" Value="66"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:27" Value="72"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:28" Value="78"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:29" Value="84"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> <EasingDoubleKeyFrame KeyTime="00:00:30" Value="90"> <EasingDoubleKeyFrame.EasingFunction> <BackEase EasingMode="EaseOut" Amplitude="0.4"/> </EasingDoubleKeyFrame.EasingFunction> </EasingDoubleKeyFrame> </DoubleAnimationUsingKeyFrames> </Storyboard> </Window.Resources> <Window.Triggers> <EventTrigger RoutedEvent="FrameworkElement.Loaded"> <BeginStoryboard Storyboard="{StaticResource sbseconds}"/> </EventTrigger> </Window.Triggers> <Grid> <Border BorderThickness="10" BorderBrush="Black" CornerRadius="300" Width="520" Height="520"> <Grid Height="500" Width="500" HorizontalAlignment="Center" VerticalAlignment="Center"> <Border CornerRadius="350"> <Border.Background> <ImageBrush ImageSource="Assets/clock.png"/> </Border.Background> </Border> <Border CornerRadius="350" Background="#778889BB"/> <Border x:Name="hour" CornerRadius="0 15 15 0" Height="10" Width="130" BorderThickness="3" BorderBrush="#FF66B01C" Margin="0,245,120,245" HorizontalAlignment="Right" RenderTransformOrigin="0,0.5"> <Border.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-90"/> <TranslateTransform/> </TransformGroup> </Border.RenderTransform> </Border> <Border x:Name="minute" CornerRadius="0 15 15 0" Height="5" Width="160" BorderThickness="3" BorderBrush="#FFD15209" Margin="250.5,247,0,248" HorizontalAlignment="Left" RenderTransformOrigin="0,0.5"> <Border.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-90"/> <TranslateTransform/> </TransformGroup> </Border.RenderTransform> </Border> <Border x:Name="second" CornerRadius="0 15 15 0" Height="3" Width="220" Background="Red" Margin="0,248,30,248" HorizontalAlignment="Right" RenderTransformOrigin="0,0.5"> <Border.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-90"/> <TranslateTransform/> </TransformGroup> </Border.RenderTransform> </Border> <Ellipse Fill="Black" Width="20" Height="20" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </Border> </Grid> </Window>
後臺代碼開啓三個指針動畫,並設置各指針動畫起始位置學習
using System; using System.Windows; using System.Windows.Input; using System.Windows.Media.Animation; namespace Clock { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); int now_hours = DateTime.Now.Hour > 12 ? (DateTime.Now.Hour - 12) : DateTime.Now.Hour; int now_minutes = DateTime.Now.Minute; int now_seconds = DateTime.Now.Second; Storyboard seconds = (Storyboard)second.FindResource("sbseconds"); seconds.Begin(); seconds.Seek(new TimeSpan(0, 0, 0, now_seconds, 0)); Storyboard minutes = (Storyboard)minute.FindResource("sbminutes"); minutes.Begin(); minutes.Seek(new TimeSpan(0, 0, now_minutes, now_seconds, 0)); Storyboard hours = (Storyboard)hour.FindResource("sbhours"); hours.Begin(); hours.Seek(new TimeSpan(0, now_hours, now_minutes, now_seconds, 0)); } private void Window_MouseDown(object sender, MouseButtonEventArgs e) { DragMove(); } } }
Design com WPF 大神的學習視頻:動畫
1/2 - Creating a clock with Animations網站
2/2 - Creating a clock with Animations
源碼中實現了所有效果,大夥能夠直接下載編譯運行;建議看大神視頻手敲一遍,加深學習印象;視頻中使用Blend佈局時鐘、設置動畫,相似PS(PhotoShop),設計界面非常方便的。
Github源碼下載:Clock
除非註明,文章均由 Dotnet9 整理髮布,歡迎轉載。
轉載請註明本文地址:https://dotnet9.com/6858.html
歡迎掃描下方二維碼關注 Dotnet9 的微信公衆號,本站會及時推送最新技術文章