اگر دوست دارید بدونید که پروگرس بار های دایره چطوری ساخته میشن کافیه این پست رو دنبال کنید.
قطعا بارها شده پروگرس بارهای مختلفی رو دیدید و دوست داشتید که خودتون هم یکیش رو بسازید و ولی نمیدونستید که چطور همچین انیمیشن های جذابی رو پیاده سازی کنید.
چون من در پلتفرم WPF برنامه نویسی میکنم این پست در محیط Visual Studio و پلتفرم WPF پیاده سازی میشه.
من قصد دارم این پروگرس بار رو پیاده سازی کنم:
اول باید این رو انالیز کنیم ببینیم چه اتفاقی داره میوفته تا بعد بتونیم پیاده سازیش کنیم:
با دونستن همین 2 مورد کارمون رو شروع میکنیم:
یه دایره ثابت روی Window قرار میدیم:
<Ellipse Width="14" Height="14" StrokeThickness="2" Stroke="#EDEDED"/>
طول و عرض 14 و ضخامتش 2 رنگش هم خاکستری میشه حالا دایره متحرک رو ایجاد میکنیم:
<Ellipse x:Name="Spinner" Width="14" Height="14" StrokeThickness="2" local:EllipseHelper.StrokeDashArrayValue="0.01" StrokeDashCap="Round" Stroke="#0078D4" RenderTransformOrigin="0.5,0.5"> <Ellipse.RenderTransform> <RotateTransform x:Name="RT" Angle="-90"/> </Ellipse.RenderTransform> <Ellipse.Triggers> <EventTrigger RoutedEvent="Loaded"> <BeginStoryboard> <Storyboard Name="spinInfinite" Duration="0:0:2" RepeatBehavior="Forever"> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="RT" Storyboard.TargetProperty="Angle"> <LinearDoubleKeyFrame KeyTime="0:0:0" Value="0"/> <LinearDoubleKeyFrame KeyTime="0:0:1" Value="450"/> <LinearDoubleKeyFrame KeyTime="0:0:2" Value="1080"/> </DoubleAnimationUsingKeyFrames> <DoubleAnimationUsingKeyFrames Storyboard.TargetName="Spinner" Storyboard.TargetProperty="(local:EllipseHelper.StrokeDashArrayValue)"><LinearDoubleKeyFrame KeyTime="0:0:0" Value="0.01"/> <LinearDoubleKeyFrame KeyTime="0:0:1" Value="9"/> <LinearDoubleKeyFrame KeyTime="0:0:2" Value="0.01"/></DoubleAnimationUsingKeyFrames> </Storyboard> </BeginStoryboard> </EventTrigger> </Ellipse.Triggers> </Ellipse>
یه دایره ابی رنگ تعریف کردیم که ضخامتش مثل قبلیه، گوشه های اون رو بصورت دایره ای گرد کردیم بعد مکان پیشفرضش برای شروع چرخش رو -90 درجه درنظر گرفتیم همینطور بهش گفتیم وقتی که لود شد یه استوری بورد ایجاد کنه که بصورت دائمی درحال اجرا باشه و بیاد 2 تا انیمیشن رو همزمان اجرا کنه، یکیش برای تغییر زاویه که توی 3 تا فریم انجام میشه و زاویه رو بین 0، 450 و 1080 تغییر میده و برای اینکه پروگرس بار جذاب بشه و حالت کش اومدن پیدا کنه وقتی که داره عملیات چرخش انجام میشه طول اون رو هم تغییر میدیم پس یه انیمیشن دیگه ایجاد میکنیم و توی 3 تا فریم مقدارش رو بین 0.01،9،0.01 تغییر میدیم.
چون مقدار StrokeDashArray بصورت DoubleCollection هستش امکان مقدار دهی اون در استوری بورد نیستش برای همین یه AttachedProperty به اسم StrokeDashArrayValue میسازیم که بیاد مقدار دریافتی رو تبدیل کنه به doubleCollection:
internal class EllipseHelper { public static readonly DependencyProperty StrokeDashArrayValueProperty = DependencyProperty.RegisterAttached( "StrokeDashArrayValue", typeof(double), typeof(EllipseHelper), new PropertyMetadata(0.0, OnStrokeDashArrayValueChanged)); public static double GetStrokeDashArrayValue(Ellipse ellipse) { return (double)ellipse.GetValue(StrokeDashArrayValueProperty); } public static void SetStrokeDashArrayValue(Ellipse ellipse, double value) { ellipse.SetValue(StrokeDashArrayValueProperty, value); } private static void OnStrokeDashArrayValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is Ellipse ellipse) { var value = (double)e.NewValue; ellipse.StrokeDashArray = new DoubleCollection() { value, 100 }; } } }
نتیجه میشه چیزی که توی عکس میبینید