Можно ли перетащить вниз панель слайдера как реальный слайдер системы Android, используя формы xamarin? - PullRequest
0 голосов
/ 23 декабря 2019

Я следовал за ползунком из здесь , но я хочу реализовать настоящий слайдер для Android, как показано ниже, перетаскивание изображения вниз.

так же, как (перетаскивание на слайд вниз):

так же, как (перетащите вниз слайд)

У кого-нибудь есть идея, пожалуйста, поделитесь здесь. Я много пробовал, но безуспешно.

@ Лукас Чжан, у тебя есть идея?

1 Ответ

0 голосов
/ 23 декабря 2019

в xaml

<AbsoluteLayout BackgroundColor="White" AbsoluteLayout.LayoutBounds="0,1,1,1">
   <!--  -->
   <StackLayout x:Name="bottomDrawer" BackgroundColor="Olive" AbsoluteLayout.LayoutBounds="0.5,1.00,0.9,0.04" AbsoluteLayout.LayoutFlags="All">
   <StackLayout.GestureRecognizers>
        <PanGestureRecognizer PanUpdated="PanGestureHandler" />
   </StackLayout.GestureRecognizers>

   <!-- put the content of panel slider here -->

   </StackLayout>
</AbsoluteLayout>

в коде позади

    double? layoutHeight;
    double layoutBoundsHeight;
    int direction;
    const double layoutPropHeightMax = 0.75;
    const double layoutPropHeightMin = 0.04;
    void PanGestureHandler(object sender, PanUpdatedEventArgs e)
    {
        layoutHeight = layoutHeight ?? ((sender as StackLayout).Parent as AbsoluteLayout).Height;
        switch (e.StatusType)
        {
            case GestureStatus.Started:
                layoutBoundsHeight = AbsoluteLayout.GetLayoutBounds(sender as StackLayout).Height;
                break;
            case GestureStatus.Running:
                direction = e.TotalY < 0 ? 1 : -1;
                break;
            case GestureStatus.Completed:
                if (direction > 0)
                {
                    Device.BeginInvokeOnMainThread(async () =>
                    {

                        var height = layoutPropHeightMin;

                        while (height < layoutPropHeightMax)
                        {
                            await Task.Delay(2);
                            height += 0.04;

                            AbsoluteLayout.SetLayoutBounds(bottomDrawer, new Rectangle(0.5, 1.00, 0.9, height));
                        }

                    });

                }
                else
                {
                    Device.BeginInvokeOnMainThread(async () =>
                    {

                        var height = layoutPropHeightMax;

                        while (height > layoutPropHeightMin)
                        {
                            await Task.Delay(2);
                            height -= 0.04;

                            AbsoluteLayout.SetLayoutBounds(bottomDrawer, new Rectangle(0.5, 1.00, 0.9, height));
                        }

                    });
                }
                break;
        }
    }

Примечание:

Поскольку мы использовали AbsoluteLayout. Вам лучше установить AbsoluteLayout.LayoutBounds вместо HeightRequest или WidthRequest, если вы хотите добавить дочерний элемент управления в панель silder.

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