Xamarin Forms Animation для нескольких элементов управления параллельно - PullRequest
0 голосов
/ 18 марта 2019

Для моего проекта Xamarin Forms мне нужно анимировать 2 Xamarin Frame элементов параллельно, но я просто не понимаю пример на их примере сайта где они используют

async void OnAnimateLabelButtonClicked(object sender, EventArgs e)
{
...
    await Task.WhenAll(
        label.ColorTo(Color.Red, Color.Blue, c => label.TextColor = c, 5000),
        label.ColorTo(Color.Blue, Color.Red, c => label.BackgroundColor = c, 5000));
...
}

Task.WhenAll , который, по моему скромному мнению, не гарантирует, что он будет работать в основном потоке графического интерфейса, так как нет Device.BeginInvokeOnMainThread () . 1014 *

Согласно этой записи , предпочтительным способом одновременного использования нескольких анимаций является

Animation a = new Animation();
a.Add(0, 1, new Animation(f => this.GuidanceLabel.Opacity = f, 1, 0, Easing.SinInOut, null));
a.Add(0, 1, new Animation(f => this.EnableAccess.Opacity = f, 1, 0, Easing.SinOut, null));
a.Commit(
        owner:this.GuidanceLabel,
        name:"DoubleFader",
        length:400,
        finished:(x, y) => {
                this.SetPhotoAccessDeniedState();
                this.GuidanceLabel.FadeTo(1, 400, Easing.CubicIn);
     }
);

Итак, я полагаю, мне нужно обернуть мою анимацию, как показано выше, в Device.BeginInvokeOnMainThread () , чтобы заставить его работать должным образом, и для моего специального случая анимации рабочий процесс будет

Frame1.TranslateYto (-90, duration1);
Frame1.Content.IsVisible = true; // Was formerly false
Frame1.TranslateYto (0, duration2);

и Frame2 параллельно в дет.

Итак, я попробовал

Device.BeginInvokeOnMainThread(() =>
{
        Animation a = new Animation();
        a.Add(0, 1, new Animation(v => frame1.RotationY = v, 0, -90));
        a.Add(0, 1, new Animation(v => frame2.RotationY = v, 0, -90));
        a.Commit(
                owner: frame1,
                name: "flip1",
                length: 50,
                finished: (x, y) =>
                {
                        frame1.Content.IsVisible = false;
                        frame2.Content.IsVisible = false;
                });

        a = new Animation();
        a.Add(0, 1, new Animation(v => frame1.RotationY = v, -90, 0));
        a.Add(0, 1, new Animation(v => frame2.RotationY = v, -90, 0));
        a.Commit(
                owner: frame1,
                name: "flip2",
                length: 250);
});

Но происходит сбой с NullReferenceExecption ...

Может быть, кто-то может пролить свет на проблему? Спасибо,

1 Ответ

1 голос
/ 19 марта 2019

Я добавляю два элемента управления Frame в окно и создаю ту же анимацию, что и вы, но у меня нет никаких проблем.Вот мой код.

 <StackLayout>
        <Frame
            x:Name="frame1"
            HorizontalOptions="CenterAndExpand"
            VerticalOptions="FillAndExpand">
            <Label
                HorizontalOptions="CenterAndExpand"
                Text="this is test!!!!!!!"
                VerticalOptions="CenterAndExpand" />
        </Frame>

        <Frame x:Name="frame2" HorizontalOptions="CenterAndExpand" VerticalOptions="EndAndExpand">
            <Label
                HorizontalOptions="CenterAndExpand"
                Text="this is test22222222222222!!!!!!!"
                VerticalOptions="CenterAndExpand" />
        </Frame>

        <Button
            x:Name="btn1"
            Clicked="btn1_Clicked"
            HeightRequest="50"
            Text="btn1"
            WidthRequest="300" />
    </StackLayout>

 private void btn1_Clicked(object sender, EventArgs e)
    {
        Device.BeginInvokeOnMainThread(() => {
            Animation a = new Animation();
            a.Add(0, 1, new Animation(v => frame1.RotationY = v, 0, -90));
            a.Add(0, 1, new Animation(v => frame2.RotationY = v, 0, -90));
            a.Commit(
                    owner: frame1,
                    name: "flip1",
                    length: 50,
                    finished: (x, y) =>
                    {
                        frame1.Content.IsVisible = false;
                        frame2.Content.IsVisible = false;
                    });

            a = new Animation();
            a.Add(0, 1, new Animation(v => frame1.RotationY = v, -90, 0));
            a.Add(0, 1, new Animation(v => frame2.RotationY = v, -90, 0));
            a.Commit(
                    owner: frame1,
                    name: "flip2",
                    length: 250);

        });
    }

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...