动画标签而不重置超时持续时间

Posted

技术标签:

【中文标题】动画标签而不重置超时持续时间【英文标题】:Animate label without resetting timeout duration 【发布时间】:2020-12-05 08:53:48 【问题描述】:

我有以下方法可以为标签设置 20 秒的动画。

    public class BlinkTriggerBehavior : Behavior<Label>

    CancellationTokenSource tokenSource = new CancellationTokenSource();
    protected override void OnAttachedTo(Label bindable)
    
        base.OnAttachedTo(bindable);
        bindable.PropertyChanged += Animate; // binding property changed event
    
    private async void Animate(object obj, PropertyChangedEventArgs e)
    
        CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
        if (e.PropertyName == "ClassId")
        
            VisualElement sender = obj as VisualElement;
            var parentAnimation = new Animation();
            var scaleUpAnimation = new Animation(d => sender.Scale = d, 1, 1.2, Easing.SpringIn);
            var fadeOutAnimation = new Animation(d => sender.Opacity = d, 1, 0, Easing.Linear);
            var scaleDownAnimation = new Animation(d => sender.Scale = d, 1.2, 1, Easing.SpringOut);
            var fadeInAnimation = new Animation(d => sender.Opacity = d, 0, 1, Easing.Linear);
            parentAnimation.Add(0, 0.5, fadeOutAnimation);
            parentAnimation.Add(0, 0.5, scaleUpAnimation);
            parentAnimation.Add(0.5, 1, scaleDownAnimation);
            parentAnimation.Add(0.5, 1, fadeInAnimation);
            parentAnimation.Commit(sender, "BlinkingVisualElement", 16, 800, repeat: () => true);
            await Task.Delay(20000);
            parentAnimation.Commit(sender, "BlinkingVisualElement", 16, 800, repeat: () => false);
        

    
    protected override void OnDetachingFrom(Label bindable)
    
        base.OnDetachingFrom(bindable);
        bindable.PropertyChanged -= Animate;
    

这个方法可以在 20 秒内被多次调用。如果调用一次,它可以正常工作并为标签设置整整 20 秒的动画,并在触发第二次调用之前等待 20 秒。每当触发此方法时,我希望它动画 20 秒。

现在发生了什么

我第一次调用了这个方法

上午 9:00:00

动画持续到 9:00:20

如果我第二次调用该方法

上午 9:00:12

它仍然只动画到 9:00:20(仅 8 秒)。我希望它动画到 9:00:32

基本上我想重置计时器并在调用此方法时显示完整的 20 秒动画。

【问题讨论】:

您是否尝试使用 CancellationToken 将此方法的内容包装在 Task.Run 中?这是使用它的经典案例。您在重新进入此方法时在 CancellationToken 上调用 Cancel。 你能发个代码sn-p吗。我尝试将动画代码放入Task.Run中,并带有取消令牌。但不起作用 我的解决方案对您有用吗?如果是,请您接受(点击此答案左上角的☑️),以便我们可以帮助更多有相同问题的人:)。 @JackHua-MSFT 抱歉耽搁了。我正在尝试不同的方法来获得解决方案。你的回答对我不起作用。我正在编辑我的问题以发布完整的类代码。我正在使用 Behavior 使标签动画化。请检查已编辑的问题并尝试给我一个解决方案。您的支持很重要..谢谢 为什么我的解决方案不适合你? 【参考方案1】:

您可以使用System.Timers.Timer 在延迟一段时间后执行任务并重置计时器以重置延迟:

public partial class MainPage : ContentPage

    System.Timers.Timer Timer1  get; set; 

    int count = 0;
    public MainPage()
    
        InitializeComponent();

    


    private async void start(object sender, EventArgs e)
    

        //VisualElement sender = obj as VisualElement;
        //var parentAnimation = new Animation();
        //var fadeOutAnimation = new Animation(d => sender.Opacity = d, 1, 0, Easing.Linear);
        //var fadeInAnimation = new Animation(d => sender.Opacity = d, 0, 1, Easing.Linear);
        //parentAnimation.Add(0, 0.5, fadeOutAnimation);
        //parentAnimation.Add(0.5, 1, fadeInAnimation);
        //parentAnimation.Add(0, 0.5, fadeOutAnimation);
        //parentAnimation.Add(0.5, 1, fadeInAnimation);
        //parentAnimation.Add(0, 0.5, fadeOutAnimation);
        //parentAnimation.Add(0.5, 1, fadeInAnimation);
        //parentAnimation.Add(0, 0.5, fadeOutAnimation);
        //parentAnimation.Add(0.5, 1, fadeInAnimation);
        //parentAnimation.Commit(sender, "BlinkingVisualElement", 16, 800, repeat: () => true);

        Console.WriteLine("start");

        if (Timer1 != null)
        
            Timer1.Stop();
            Timer1.Dispose();
        

        Timer1 = new System.Timers.Timer();
        //count every 1 second
        Timer1.Interval = 1000;
        Timer1.Enabled = true;

        //reset count
        count = 0;

        Timer1.Start();

        Timer1.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
        

            Device.BeginInvokeOnMainThread(() =>
            
                count++;

                //10 here is the delay time
                if (count == 20)
                
                    Console.WriteLine("finish");
                    
                    //parentAnimation.Commit(sender, "BlinkingVisualElement", 16, 800, repeat: () => false);

                    Timer1.Stop();
                    Timer1.Dispose();
                
                else
                
                    Console.WriteLine("current count(seconds):" + count);
                

            );
        ;
       

【讨论】:

以上是关于动画标签而不重置超时持续时间的主要内容,如果未能解决你的问题,请参考以下文章

如何重置屏幕超时android?

重置动画时间线 - blender 2.6

重置会话超时而不在 ASP.Net 中进行回发

Laravel 更改密码重置特定令牌的令牌持续时间

如何在 Javascript/jQuery 中重置超时?

SocketException:连接重置 - 客户端 Jersey 2.0 Java 7