【问题标题】:WPF - Create a floating animated clickable control (image or...)WPF - 创建一个浮动动画可点击控件(图像或...)
【发布时间】:2015-02-02 13:41:52
【问题描述】:

我想在我的 WPF 应用程序中创建一个像氦气球一样的浮动动画可点击控件,它有时也会向右或向左移动。

氦气球喜欢上去!但他们也会向右或向左移动,如果 我们轻拍它们或通过风。

在提前的情况下,有时会向右或向左转

...................................... ....................

所以我搜索了网络,但没有找到任何有用的示例项目或库或样式。

  • 如何在 WPF 中创建样式和动画以显示图像或 控制浮力或悬浮在空中。?

  • 您有什么建议可以简单地实现这个想法吗?

编辑:

  • 您对左右随机无限平滑转弯有何建议。例如向左 51 度,然后向右 163 度,然后....我想把我的气球放在我的窗口中,并且经常在窗口的顶部

编辑:

我根据这些答案创建了一个动画,但通过操纵它们并在气球图像及其容器上添加多个并行动画来更加复杂。 ;) 谢谢大家...

现在我的主要结果是这样的:

【问题讨论】:

    标签: c# wpf floating animated suspend


    【解决方案1】:

    您可以通过@Ega 提到的DoubleAnimationRotateTransform 来实现此目的。为了回答您的“随机和无限”左右转向,您可以这样做(这是非常基本的,但可以完成工作)。

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var rnd = new Random();
            var direction = -1;
    
            while (true)
            {
                var percent = rnd.Next(0, 100);
                direction *= -1; // Direction changes every iteration
                var rotation = (int)((percent / 100d) * 45 * direction); // Max 45 degree rotation
                var duration = (int)(750 * (percent / 100d)); // Max 750ms rotation
    
                var da = new DoubleAnimation
                {
                    To = rotation,
                    Duration = new Duration(TimeSpan.FromMilliseconds(duration)),
                    AutoReverse = true // makes the balloon come back to its original position
                };
    
                var rt = new RotateTransform();
                Balloon.RenderTransform = rt; // Your balloon object
                rt.BeginAnimation(RotateTransform.AngleProperty, da);
    
                await Task.Delay(duration * 2); // Waiting for animation to finish, not blocking the UI thread
            }
        }
    

    编辑 .NET 3.5

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var thread = new Thread(this.AnimateBalloon);
            thread.Start();
        }
    
        public void AnimateBalloon()
        {
            var rnd = new Random();
            var direction = -1;
    
            while (true)
            {
                var percent = rnd.Next(0, 100);
                direction *= -1; // Direction changes every iteration
                var rotation = (int)((percent / 100d) * 45 * direction); // Max 45 degree rotation
                var duration = (int)(750 * (percent / 100d)); // Max 750ms rotation
    
                Balloon.Dispatcher.BeginInvoke(
                    (Action)(() =>
                    {
                        var da = new DoubleAnimation
                        {
                            To = rotation,
                            Duration = new Duration(TimeSpan.FromMilliseconds(duration)),
                            AutoReverse = true // makes the balloon come back to its original position
                        };
    
                        var rt = new RotateTransform();
                        Balloon.RenderTransform = rt; // Your balloon object
                        rt.BeginAnimation(RotateTransform.AngleProperty, da);
                    }));
    
                Thread.Sleep(duration * 2);
            }
        }
    

    【讨论】:

    • 我使用 .net 3.5。您可以更改您的代码以支持 .net 3.5 吗?任务和...不受支持....
    【解决方案2】:

    Farseer Physics Engine 用于 C# 将允许您创建真实世界的模拟。你可以控制重力、惯性、力甚至其他物理东西。

        World world = new World(new Vector2(0f, 9.82f));
        //We create a body object and make it dynamic (movable)
        Body myBody = world.CreateBody();
        myBody.BodyType = BodyType.Dynamic;
    
        //We create a circle shape with a radius of 0.5 meters
        CircleShape circleShape = new CircleShape(0.5f);
    
        //We fix the body and shape together using a Fixture object
        Fixture fixture = myBody.CreateFixture(circleShape);
    

    对于这种情况,您可能需要创建一个重力较小的世界,并且物体会飞行。您可以从对象的任一侧施加力来移动它。

    【讨论】:

      【解决方案3】:

      在C#中DoubleAnimationSystem.Windows.Media.Animation;NameSpace里面一个强大的类支持动画所以这个类有一些方法和属性让我告诉你

      DoubleAnimation ANobj = new DoubleAnimation();//make object from DoubleAnimation
      ANobj.From=0 //the 0 is point you want to star animation
      ANobj.To=270//the end pont of moving 
      // that values  is dependent on your self as you want
      ANobj.Duration = new Duration(TimeSpan.FromSeconds(60)); //specify the duration of moving 
      ANobj.RepeatBehavior = RepeatBehavior.Forever;//RepeatBehavior as you want
      

      还可以使用RotateTransform 类在 WPF 中旋转 C# 组件

      RotateTransform RTobj=new RotateTransform();//make object from RotateTransform
      RTobj.CenterX = 277;//X point of your Element(Componet)
      RTobj.CenterY = 245;//Y point of your Element(Componet)
      RTobj.Angle = 360;//angle between 
      RTobj.BeginAnimation(RotateTransform.AngleProperty,ANobj);
      

      同样在配置完成后,将此 obj 设置为您的 Element 中的 RenderTransform 属性

      yourElementName.RenderTransform=RTobj
      

      如果你想了解更多关于MSDNSystem.Windows.Media.Animation的信息

      【讨论】:

      • 你也有这个 XAML 形式的吗?
      • 是的,但我的项目是库尔德手动时钟,它像手动时钟一样动画
      • @Ezzat,您的代码是个好主意,我在我的应用程序中使用了它,但是您对左右随机无限平滑转动的建议是什么?例如向左 51 度,然后向右 163 度,然后....
      • ANobj.From=51; ANobj.To=163; ANobj.RepeatBehavior = 重复行为.永远; RTobj.CenterX = 106
      【解决方案4】:

      这可以帮助你在这里,我把多边形和一个图像从左到右你可以设置你的选择:)

      <Window x:Class="Animation.Window1"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="XAML Animation - Spinning Stars" Height="300" Width="355"
              >
              <Grid Name="myGrid">
                <Canvas Margin="15,18,18,26" MinHeight="50" MinWidth="50" Name="canvas1">
                  <!-- Invisible element just to host composite transform -->
                  <Polygon
                      Name ="mypolygon1"
      
                      Stroke="Blue"
      
                      StrokeThickness="1.0"
      
                      Points="176.5,50 189.2,155.003 286.485,113.5 201.9,177 286.485,240.5 
      
              189.2,198.997 176.5,304 163.8,198.997 66.5148,240.5 151.1,177 
      
              66.5148,113.5 163.8,155.003">
      
                    <Polygon.RenderTransform>
                      <TransformGroup>
                        <RotateTransform x:Name="xformRotate" CenterX="176" CenterY="145" />
                        <TranslateTransform x:Name="xformTranslate" X ="-50" Y="-50" />
                        <ScaleTransform x:Name ="xformScale" ScaleX=".25" ScaleY=".25" />
                      </TransformGroup>
                      </Polygon.RenderTransform>
      
                    <Polygon.Fill>
      
                        <SolidColorBrush Color="Blue">
                            <!--<ColorAnimation From="Yellow" To="Blue" Duration="7"
      
                              RepeatCount="500" AutoReverse="True"/>-->
      
                        </SolidColorBrush>
      
                      </Polygon.Fill>
                      <Polygon.Triggers>
                        <EventTrigger RoutedEvent="Polygon.Loaded">
                          <EventTrigger.Actions>
                            <BeginStoryboard>
                            <Storyboard>
                              <!-- RotateTransform angle from 0 to 360, repeated -->
                              <DoubleAnimation Storyboard.TargetName="xformRotate"
                                               Storyboard.TargetProperty="Angle"
                                               From="0" To="360" Duration="0:0:01"
                                               RepeatBehavior="Forever" />
                              <DoubleAnimation Storyboard.TargetName="xformTranslate"
                                               Storyboard.TargetProperty="X"
                                               From="1" To="750" Duration="0:0:14"
                                               AutoReverse ="True" RepeatBehavior="Forever" />
                            </Storyboard>
                            </BeginStoryboard>
                          </EventTrigger.Actions>
                        </EventTrigger>
                        </Polygon.Triggers>
      
                    </Polygon>
                  <Polygon
                      Name ="mypolygon2"
      
                      Stroke="Red"
      
                      StrokeThickness="1.0"
      
                      Points="176.5,50 189.2,155.003 286.485,113.5 201.9,177 286.485,240.5 
      
              189.2,198.997 176.5,304 163.8,198.997 66.5148,240.5 151.1,177 
      
              66.5148,113.5 163.8,155.003">
      
                    <Polygon.RenderTransform>
                      <TransformGroup>
                        <RotateTransform x:Name="xformRotateIt"   CenterX="176" CenterY="145"  />
                        <ScaleTransform ScaleX=".25" ScaleY=".25" />
                        <TranslateTransform  x:Name="xformTranslateIt" X="0" Y="100" />
                      </TransformGroup>
                    </Polygon.RenderTransform>
      
                    <Polygon.Fill>
      
                      <SolidColorBrush x:Name ="mybrush" Color="Red" />
                    </Polygon.Fill>
                    <Polygon.Triggers>
                      <EventTrigger RoutedEvent="Polygon.Loaded">
                        <EventTrigger.Actions>
                          <BeginStoryboard>
                            <Storyboard x:Name="myStoryBoard" Completed="OnCompletedAnimation">
                              <!-- RotateTransform angle from 0 to 360, repeated -->
                              <DoubleAnimation Storyboard.TargetName="xformRotateIt"
                                               Storyboard.TargetProperty="Angle"
                                               From="0" To="360" Duration="0:0:01"
                                               RepeatBehavior="Forever" />
                              <DoubleAnimation Storyboard.TargetName="xformTranslateIt"
                                               Storyboard.TargetProperty="X"
                                               From="1" To="100" Duration="0:0:14"
                                               AutoReverse ="True" RepeatBehavior="Forever" />
                              <ColorAnimation Storyboard.TargetName="mybrush" Storyboard.TargetProperty="Color" From="Red" To="Blue" Duration="0:0:7" 
                              RepeatBehavior="Forever" AutoReverse="True"/>
                            </Storyboard>
                          </BeginStoryboard>
                        </EventTrigger.Actions>
                      </EventTrigger>
                    </Polygon.Triggers>
      
                  </Polygon>
      
      
                  <Image Margin="75,61,0,119" Name="image1" Source="Images\KENNY.bmp" HorizontalAlignment="Left" Width="72">
                    <Image.RenderTransform>
                      <TransformGroup>
                        <RotateTransform x:Name="KennyRotateIt"   CenterX="50" CenterY="50" Angle="45"  />
                        <ScaleTransform x:Name="KennyScaleIt" ScaleX=".75" ScaleY=".75" />
                        <TranslateTransform  x:Name="KennyTranslateIt" X="0" Y="100" />
                      </TransformGroup>
                    </Image.RenderTransform>
                    <Image.Triggers>
                      <EventTrigger RoutedEvent="Image.Loaded">
                        <EventTrigger.Actions>
                          <BeginStoryboard>
                            <Storyboard x:Name="myStoryBoard1" Completed="OnCompletedAnimation">
                              <!-- RotateTransform angle from 0 to 360, repeated -->
                              <DoubleAnimation Storyboard.TargetName="KennyRotateIt"
                                               Storyboard.TargetProperty="Angle"
                                               From="0" To="360" Duration="0:0:01"
                                               RepeatBehavior="Forever" />
                              <DoubleAnimationUsingKeyFrames
                                   Storyboard.TargetName="KennyTranslateIt"
                                   Storyboard.TargetProperty="X"
                                   Duration="0:0:10" AutoReverse="True" RepeatBehavior="Forever">
      
                                <!-- These KeyTime properties are specified as TimeSpan values 
                           which are in the form of "hours:minutes:seconds". -->
                                <LinearDoubleKeyFrame Value="10" KeyTime="0:0:3" />
                                <LinearDoubleKeyFrame Value="100" KeyTime="0:0:5" />
                                <LinearDoubleKeyFrame Value="200" KeyTime="0:0:10" />
                              </DoubleAnimationUsingKeyFrames>
                              <!-- DoubleAnimation Storyboard.TargetName="KennyTranslateIt"
                                               Storyboard.TargetProperty="X"
                                               From="-50" To="100" Duration="0:0:14"
                                               AutoReverse ="True" RepeatBehavior="Forever" / -->
                            </Storyboard>
                          </BeginStoryboard>
                        </EventTrigger.Actions>
                      </EventTrigger>
                    </Image.Triggers>
                  </Image>
                </Canvas>
            </Grid>
      
                  </Window>
      

      【讨论】:

        【解决方案5】:

        这是我在高中时做的一个。现在可能已经过时了,但只是为了兴趣。

        //the animation thread
                System.Threading.Thread thr;
        
                thr = new System.Threading.Thread(annimate);
                thr.Start();
        

        动画方法

         void annimate()
            {     
                try
                {       
                    double angleToAnimateTo = 20;
                    double CurrentAngle = 0;
                    bool increment = false;
        
                    while (IsAnimating)
                    {
                        if (increment)
                            CurrentAngle++;
                        else
                            CurrentAngle--;
        
                        if (CurrentAngle == angleToAnimateTo )
                            increment = false;
        
                        if (CurrentAngle == (angleToAnimateTo * -1))
                            increment = true;
        
        
                        this.Dispatcher.Invoke((Action)(() =>
                        {
                            this.imgBallon.RenderTransform = new RotateTransform(CurrentAngle);
                        }));
        
                        System.Threading.Thread.Sleep(100);
                    }
        
        
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
        

        imgBalloon 是 wpf 中的一个简单图像。这是 xaml ..

        <Image x:Name="imgBallon" 
                Source="/img/balloon_blue.png" Width="50"> </Image>
        

        【讨论】:

        • 感谢@Jonny,但是当我们使用Animations features of WPF 时,我们有Softer Moves
        • @RAM,是的,当然 :) 就像我说的,这是几年前我还在上学的时候完成的。它只是为了利益:)
        猜你喜欢
        • 2011-02-12
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 2011-04-09
        相关资源
        最近更新 更多