Một cách có thể là, để tạo một lớp hoạt hình tùy chỉnh tạo hiệu ứng cho bàn chải. Tôi đã tìm thấy một cách đơn giản để làm điều đó bằng cách tạo một lớp học, bắt nguồn từ AnimationTimeline
. Chúng ta có thể ghi đè lên một số thành viên trong lớp tùy chỉnh, trong số những thứ khác là AnimationTimeline.GetCurrentValue
method. Nó trả về một giá trị phụ thuộc vào tiến trình hoạt ảnh và giá trị bắt đầu và kết thúc.
Cách đơn giản nhất là tạo VisualBrush
và crossfade bắt đầu- với giá trị cuối cùng với thuộc tính Opacity
trên điều khiển con. Kết quả là một lớp như sau:
public class BrushAnimation : AnimationTimeline
{
public override Type TargetPropertyType
{
get
{
return typeof(Brush);
}
}
public override object GetCurrentValue(object defaultOriginValue,
object defaultDestinationValue,
AnimationClock animationClock)
{
return GetCurrentValue(defaultOriginValue as Brush,
defaultDestinationValue as Brush,
animationClock);
}
public object GetCurrentValue(Brush defaultOriginValue,
Brush defaultDestinationValue,
AnimationClock animationClock)
{
if (!animationClock.CurrentProgress.HasValue)
return Brushes.Transparent;
//use the standard values if From and To are not set
//(it is the value of the given property)
defaultOriginValue = this.From ?? defaultOriginValue;
defaultDestinationValue = this.To ?? defaultDestinationValue;
if (animationClock.CurrentProgress.Value == 0)
return defaultOriginValue;
if (animationClock.CurrentProgress.Value == 1)
return defaultDestinationValue;
return new VisualBrush(new Border()
{
Width = 1,
Height = 1,
Background = defaultOriginValue,
Child = new Border()
{
Background = defaultDestinationValue,
Opacity = animationClock.CurrentProgress.Value,
}
});
}
protected override Freezable CreateInstanceCore()
{
return new BrushAnimation();
}
//we must define From and To, AnimationTimeline does not have this properties
public Brush From
{
get { return (Brush)GetValue(FromProperty); }
set { SetValue(FromProperty, value); }
}
public Brush To
{
get { return (Brush)GetValue(ToProperty); }
set { SetValue(ToProperty, value); }
}
public static readonly DependencyProperty FromProperty =
DependencyProperty.Register("From", typeof(Brush), typeof(BrushAnimation));
public static readonly DependencyProperty ToProperty =
DependencyProperty.Register("To", typeof(Brush), typeof(BrushAnimation));
}
Bạn có thể sử dụng nó như mọi khi trong XAML:
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard >
<local:BrushAnimation Storyboard.TargetName="border"
Storyboard.TargetProperty="Background"
Duration="0:0:5" From="Red"
RepeatBehavior="Forever" AutoReverse="True" >
<local:BrushAnimation.To>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FF00FF2E" Offset="0.005"/>
<GradientStop Color="#FFC5FF00" Offset="1"/>
<GradientStop Color="Blue" Offset="0.43"/>
</LinearGradientBrush>
</local:BrushAnimation.To>
</local:BrushAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
hoặc trong mã đằng sau:
var animation = new BrushAnimation
{
From = Brushes.Red,
To = new LinearGradientBrush (Colors.Green, Colors.Yellow, 45),
Duration = new Duration(TimeSpan.FromSeconds(5)),
};
animation.Completed += new EventHandler(animation_Completed);
Storyboard.SetTarget(animation, border);
Storyboard.SetTargetProperty(animation, new PropertyPath("Background"));
var sb = new Storyboard();
sb.Children.Add(animation);
sb.Begin();
Nó cũng có thể mở rộng các BrushAnimation
với quá tải constructor vv, do đó, nó trông giống như một loại hình hoạt hình .NET.
Điều đó hoạt động tốt nếu tôi biết loại bàn chải nào mong đợi. Nhưng trong trường hợp của tôi, có thể có màu đồng nhất, gradient tuyến tính hoặc radialgradient tùy thuộc vào cài đặt suer. Có cách nào chung để cọ vẽ hoạt hình (độc lập với kiểu cọ vẽ)? –