在 Xamarin Forms 中按比例动画调整框视图的大小

Animating the resizing of a boxview proportionally in Xamarin Forms

在我的共享项目中,我需要通过单击按钮来调整 BoxView 的大小。它应该最好在不占用 space 和按比例占用任何屏幕尺寸的 25% 之间切换,为此我通常使用 AbsoluteLayout.

我试过使用 AbsoluteLayoutLayoutTo,但由于 LayoutTo 以像素为单位运行,所以我无法按比例调整大小。

然后我更改了我的解决方案以利用 Grid 和自定义动画,如下面的代码所示。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:AnimationTest"
             x:Class="AnimationTest.MainPage">
    <Grid ColumnSpacing="0" RowSpacing="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="9*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" x:Name="LeftColumn"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>

        <BoxView Color="DarkMagenta" Grid.Row="0" Grid.Column="0"/>

        <Button Text="Animate" Grid.Row="1" Grid.Column="1" Clicked="Button_Clicked"/>

    </Grid>
</ContentPage>

和代码隐藏

namespace AnimationTest
{
    public partial class MainPage : ContentPage
    {
        Animation _animation;
        bool _boxCollapsed = false;

        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Clicked(object sender, EventArgs e)
        {
            switch (_boxCollapsed)
            {
                case true:
                    _animation = new Animation(
                    (d) => LeftColumn.Width = new GridLength(1, GridUnitType.Star));
                    _animation.Commit(this, "the animation", 16, 1000, Easing.SinIn, null, null);
                    _boxCollapsed = false;
                    break;
                case false:
                    _animation = new Animation(
                    (d) => LeftColumn.Width = new GridLength(0, GridUnitType.Star));
                    _animation.Commit(this, "the animation", 16, 1000, Easing.SinIn, null, null);
                    _boxCollapsed = true;
                    break;
            }
        }
    }
}

虽然这提出了两个问题。

虽然目前这不是问题,但此解决方案显然会调整整个列的大小,而不仅仅是 BoxView,这可能会在后期阶段成为问题。 第二个问题是它似乎忽略了 Easing 参数,只是立即在两个宽度之间移动而没有实际动画。

我希望至少有人能告诉我关于 Easing 的问题是什么,或者想出一个不同的、希望更优雅的解决方案。

你只需要稍微改变一下动画线上的代码,我已经给你提示了如何获得 25% 的屏幕尺寸。希望对你有帮助。

private void Button_Clicked(object sender, EventArgs e)
    {
        var twentyFivePercentOfScreen = this.Width * .25;

        switch (_boxCollapsed)
        {
            case true:
                _animation = new Animation(
                    (d) => LeftColumn.Width = d, 0, twentyFivePercentOfScreen);
                _animation.Commit(this, "the animation", 16, 250, Easing.SinIn, null, null);
                _boxCollapsed = false;
                break;
            case false:
                _animation = new Animation(
                    (d) => LeftColumn.Width = d, twentyFivePercentOfScreen, 0);
                _animation.Commit(this, "the animation", 16, 250, Easing.SinIn, null, null);
                _boxCollapsed = true;
                break;
        }
    }