Xamarin程序在动画输入时挂起

时间:2017-12-21 19:22:17

标签: c# animation xamarin

哟! 我的应用程序在更改页面时会执行一些自定义动画,这意味着: 在一个布局中捆绑当前内容和下一个内容

- >使当前内容可见,另一个不可见

- >做动画

- >使下一个内容可见,另一个不可见

- >使用BeginInvokeOnMainThread

将内容设置为JUST下一个内容

它很完美,但遗憾的是,如果我是按下按钮,同时动画我的应用程序完全挂起。我已经尝试了所有内容的isEnabled和InputTransparent,但没有成功。

我的代码:

        prevScreen.InputTransparent = true;
        nextScreen.InputTransparent = true;
        AbsoluteLayout anim = new AbsoluteLayout();
        anim.Children.Add(prevScreen);
        anim.Children.Add(nextScreen);
        anim.Children.Add(screenAnimation);
        double Ax = prevScreen.TranslationX, Bx = nextScreen.TranslationX;
        AbsoluteLayout.SetLayoutFlags(prevScreen, AbsoluteLayoutFlags.SizeProportional);
        AbsoluteLayout.SetLayoutBounds(prevScreen, new Rectangle(0, 0, 1, 1));
        AbsoluteLayout.SetLayoutFlags(nextScreen, AbsoluteLayoutFlags.SizeProportional);
        AbsoluteLayout.SetLayoutBounds(nextScreen, new Rectangle(0, 0, 1, 1));
        AbsoluteLayout.SetLayoutFlags(screenAnimation, AbsoluteLayoutFlags.SizeProportional);
        AbsoluteLayout.SetLayoutBounds(screenAnimation, new Rectangle(0, 0, 1, 1));
        main.Content = anim;
        screenAnimation.Left.TranslationX = -main.Width;
        screenAnimation.Right.TranslationX = main.Width;
        nextScreen.IsVisible = false;
        prevScreen.IsVisible = true;
        prevScreen.IsEnabled = false;
        nextScreen.IsEnabled = false;
        main.Content.IsEnabled = false;
        Task.Run(() =>
        {
            while (screenAnimation.Left.TranslationX <= -main.Width / 2)
            {
                Task.Delay(4).Wait();
                screenAnimation.Left.TranslationX += 2;
                screenAnimation.Right.TranslationX -= 2;
            }
            screenAnimation.Left.TranslationX = -main.Width / 2;
            screenAnimation.Right.TranslationX = main.Width / 2;
            Device.BeginInvokeOnMainThread(() =>
            {
                nextScreen.IsVisible = true;
                prevScreen.IsVisible = false;
            });
            Task.Delay(500).Wait();
            while (screenAnimation.Left.TranslationX >= -main.Width)
            {
                Task.Delay(4).Wait();
                screenAnimation.Left.TranslationX -= 2;
                screenAnimation.Right.TranslationX += 2;
            }
            screenAnimation.Left.TranslationX = -main.Width;
            screenAnimation.Right.TranslationX = main.Width;
            Device.BeginInvokeOnMainThread(() => { main.Content = nextScreen; main.Content.IsEnabled = true; });
        });

我知道这是Xamarin,每个人都试图避免它,但我学校的部分诅咒所以我不能切换到......甚至unity3d会更好XD 有任何想法吗?

好的,感谢所有有用的评论和回答讽刺 解决问题的是使用Xamarins Animation.Commit函数。 我避免它,因为我不知道BeginInvokeOnMainThread函数,结果是一团糟,所以我决定自己做,并使用多线程。

我仍然不知道是什么原因导致错误只是因为我正在做一点多线程。因为动画正在运行而且其他一切也正在阻止当你按下任何类型的功能按钮但我已经阻止动画运行时,我无法想象出现了什么问题。也许这是因为我没有使用async-await-stuff但是当我试图这样做时,应用程序在visual studio中与“非托管代码”崩溃了。很有帮助。无法阅读错误说明。

0 个答案:

没有答案