使用正弦波动画圆形填充

5
我试图使用正弦波使圆形填充动画化。以下是我制作的示例图像:
所以黑色是圆形,正如您所看到的,它以正弦波的方式被切断。 能否在正弦波“行进”的同时决定波应该放置在圆的哪个位置,方法是使用圆的完整高度的Y值(这样看起来就像圆中有水,并在上面产生波浪,并且能够决定圆中有多少“水”)?
有没有办法做到这一点?也许有一些地方可以了解这些类型的动画?
需要注意的一件事是,灰色背景表示透明度,因此圆的“切断”部分应该是透明的。
1个回答

9

实现这样的效果需要使用OpacityMask。下面的示例使用了一个设置为Tile的VisualBrush作为遮罩,并使用刷子的transform属性来实现您所描述的动画效果。

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="447" Width="569">
    <Window.Resources>
        <Storyboard x:Key="Wave">
            <DoubleAnimation Storyboard.TargetProperty="(UIElement.OpacityMask).(Brush.RelativeTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="ellipse" RepeatBehavior="Forever" From="0" To="1" Duration="0:0:1" />
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard Storyboard="{StaticResource Wave}"/>
        </EventTrigger>
    </Window.Triggers>
    <Canvas>
        <Ellipse x:Name="ellipse" Fill="#FF82C6FF" Height="160" Canvas.Left="320" Canvas.Top="80" Width="160">
            <Ellipse.OpacityMask>
                <VisualBrush Visual="{Binding ElementName=wave}" TileMode="Tile" Viewport="0,-1,1,3" Stretch="None"  >
                    <VisualBrush.RelativeTransform>
                        <TransformGroup>
                            <ScaleTransform />
                            <SkewTransform/>
                            <RotateTransform/>
                            <TranslateTransform Y="{Binding Value,ElementName=y}"  />
                        </TransformGroup>
                    </VisualBrush.RelativeTransform>
                </VisualBrush>
            </Ellipse.OpacityMask>

            </Ellipse>
        <Grid x:Name="wave" Height="377" Canvas.Left="80" Canvas.Top="23" Width="160" Background="#00000000">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*"/>
                <RowDefinition Height="{Binding Value,ElementName=amplitude}"/>
                <RowDefinition Height="1*"/>
            </Grid.RowDefinitions>
            <Path Fill="#FF82C6FF" Data="M12.5,1.6925709 C31.25,1.6925709 31.25,18.615654 50,18.615654 68.75,18.615654 68.75,1.6925709 87.5,1.6925709 87.499909,27.077196 87.5,27.077107 87.5,27.077107 63.28125,27.077136 12.5,27.077196 12.5,27.077196 12.5,27.077196 12.500094,27.077196 12.5,1.6925709 z" Stretch="Fill" Grid.Row="1"/>
            <Rectangle Fill="#FF82C6FF" Grid.Row="2" Margin="0,-1,0,0" />
        </Grid>
        <Slider x:Name="y" Width="200" Minimum="-0.6" Maximum="1" Value="0"/>
        <Slider x:Name="amplitude" Width="200" Minimum="1" Maximum="100" Value="20" Canvas.Top="23"/>
    </Canvas>
</Window>

为了隐藏遮罩层,你可以直接将其放置在VisualBrush内,而不是像上面那样使用绑定。你可能还想查看其他类型的画笔以及它们的转换和视区/视图框。更新:现在遮罩层分为两部分,可以分别调整波幅。你也可以调整ScaleTransform.ScaleX来改变频率,但你需要确保你得到整个波形,否则动画会卡顿。例如,请尝试0.5、0.25、0.1。

不过有一件事; 你如何减小波的振幅?我对路径语法不是很擅长,真想不出来。 - Tokfrans
我在Expression Blend中绘制了这个形状。我会添加一些备选路径让你尝试。 - Kris
我该如何在UWP中实现类似的功能? - Shubham Sahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接