[EditorBrowsable(EditorBrowsableState.Never)]
public class LottieButtonExtension : ButtonExtension
{
- /// <summary>
- /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL
- /// </summary>
+ /// <inheritdoc/>
[EditorBrowsable(EditorBrowsableState.Never)]
- public LottieButtonExtension() : base()
+ public override bool ProcessIcon(Button button, ref ImageView icon)
{
- LottieView = new LottieAnimationView();
- }
+ if (button.Style is ILottieButtonStyle lottieStyle)
+ {
+ var lottieView = LottieExtensionHelper.CreateLottieView(lottieStyle);
+ var parent = icon.GetParent();
- /// <summary>
- /// The Lottie view that will be used as an icon part in a Button.
- /// </summary>
- [EditorBrowsable(EditorBrowsableState.Never)]
- protected LottieAnimationView LottieView { get; set; }
+ icon.Unparent();
+ icon.Dispose();
+ icon = lottieView;
+ parent?.Add(icon);
- /// <inheritdoc/>
- [EditorBrowsable(EditorBrowsableState.Never)]
- public override ImageView OnCreateIcon(Button button, ImageView icon)
- {
- InitializeLottieView(button, LottieView);
+ return true;
+ }
- return LottieView;
+ return false;
}
/// <inheritdoc/>
[EditorBrowsable(EditorBrowsableState.Never)]
public override void OnControlStateChanged(Button button, View.ControlStateChangedEventArgs args)
{
- UpdateLottieView(button, args.PreviousState, LottieView);
+ if (button.Style is ILottieButtonStyle lottieStyle && button.Icon is LottieAnimationView lottieView)
+ {
+ LottieExtensionHelper.UpdateLottieView(lottieView, lottieStyle, args.PreviousState, button.ControlState);
+ }
}
+ }
- internal static void InitializeLottieView(Button button, LottieAnimationView lottieView)
+ internal static class LottieExtensionHelper
+ {
+ internal static LottieAnimationView CreateLottieView(ILottieButtonStyle lottieStyle)
{
- if (button.Style as ILottieButtonStyle == null)
+ var lottieView = new LottieAnimationView()
{
- throw new Exception("LottieButtonExtension must be used within a ILottieButtonStyle or derived class.");
- }
-
- var lottieStyle = (ILottieButtonStyle)button.Style;
- lottieView.URL = lottieStyle.LottieUrl;
- lottieView.StopBehavior = LottieAnimationView.StopBehaviorType.MaximumFrame;
+ URL = lottieStyle.LottieUrl,
+ StopBehavior = LottieAnimationView.StopBehaviorType.MaximumFrame
+ };
if (lottieStyle.PlayRange != null && lottieStyle.PlayRange.GetValue(ControlState.Normal, out var result))
{
result.Show(lottieView, true);
}
+ return lottieView;
}
- internal static void UpdateLottieView(Button button, ControlState previousState, LottieAnimationView lottieView)
+ internal static void UpdateLottieView(LottieAnimationView lottieView, ILottieButtonStyle lottieStyle, ControlState previousState, ControlState currentState)
{
- var lottieStyle = ((ILottieButtonStyle)button.Style);
- if (lottieStyle != null && lottieStyle.PlayRange != null && lottieStyle.PlayRange.GetValue(button.ControlState, out var result))
+ if (lottieStyle.PlayRange != null && lottieStyle.PlayRange.GetValue(currentState, out var result))
{
result.Show(lottieView, !previousState.Contains(ControlState.Pressed));
}