Windows Phone开发(42):缓动动画

原文:Windows Phone开发(42):缓动动画

前面在讨论关键帧动画的时候,我有意把几个带缓动动画的关键帧动画忽略掉,如EasingColorKeyFrame、EasingDoubleKeyFrame和EasingPointKeyFrame,其实为数不多,就这么几个。因为我希统一放到这节课程来吹一下缓动函数。

所谓缓动函数,就是我们在代数里面说的函数,说白了嘛,就是根特定的函数规则,用输入的值算出最终值,使得动画在两个关键帧之间不再是均衡过度,而是带有加/减速或其他效果,当然,还要取决于算法。

 

比如函数

 

所以,我们看出来了,缓动函数涉及复杂的数学运算,不过,灰常幸运的是,常用的缓函数MS已经为我们封装好了,这也是从WPF/Silverlight中迁移到WP的,集成性兼容性MD的好,所以,在使用的时候,大家可以轻松一大把了,因此,当你在练习的时候,记得冲一杯咖啡放在桌上,一边写代码一边品尝吧。呵呵,编程快乐,快乐编程。

 

如果你干过WPF或SL,这些东西你会觉得灰常Easy,我不是第一次强调了,所以说,基础很重要,把基础扎实了,无论你学习什么新玩意儿,都可以一通百通的,不管你信不信,反正我信了。

 

如何你对缓动函数没有一个直观的认识也不要紧,下面推荐大家一个游戏,很好玩的,不玩你学WP会后悔的。游戏地址:http://samples.msdn.microsoft.com/Silverlight/silverlight_next/Animations/easing_functions_gallery/testpage.html

记住要认真玩,这样你才会熟悉缓动函数与相关的类。

 

某致理名言说得好,“自己动手,丰衣足食”,还是老规矩,实例决定一切,动手干活吧。

 

演练一、请参考以下XAML代码构建你的UI。

    <Grid Loaded="gridLoaded">
        <Ellipse HorizontalAlignment="Left"
                 VerticalAlignment="Top"
                 Fill="Orange"
                 Width="100"
                 Height="100"
                 x:Name="elp">
            <Ellipse.RenderTransform>
                <TranslateTransform x:Name="trm"/>
            </Ellipse.RenderTransform>
        </Ellipse>

        <Grid.Resources>
            <Storyboard x:Name="std">
                <DoubleAnimationUsingKeyFrames Duration="0:0:8"
                                               Storyboard.TargetName="trm"
                                               Storyboard.TargetProperty="Y"
                                               RepeatBehavior="30">
                    <LinearDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:8" Value="485">
                        <EasingDoubleKeyFrame.EasingFunction>
                            <BounceEase Bounciness="3" Bounces="3"/>
                        </EasingDoubleKeyFrame.EasingFunction>
                    </EasingDoubleKeyFrame>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </Grid.Resources>
    </Grid>

后台C#代码启用动画。

        private void gridLoaded(object sender, RoutedEventArgs e)
        {
            this.std.Begin();
        }

现在,运行上面的示例,你会发现圆在下落的过程发生了两次回弹,动画才结束,而且一开始较慢,后来渐渐加速,这就是缓动函数所产生的效果。

 

 

演练二。

参考以下XAML代码创建UI界面。

    <Grid Loaded="gridLoaded">
        <Rectangle Margin="35" x:Name="rec">
            <Rectangle.Fill>
                <LinearGradientBrush x:Name="brs" StartPoint="0,0.5" EndPoint="1,0.5">
                    <GradientStop Color="Blue" Offset="0"/>
                    <GradientStop Color="Yellow" Offset="0.5"/>
                    <GradientStop Color="Blue" Offset="1"/>
                </LinearGradientBrush>
            </Rectangle.Fill>
        </Rectangle>

        <Grid.Resources>
            <Storyboard x:Name="std">
                <DoubleAnimationUsingKeyFrames Duration="0:0:10"
                                               Storyboard.TargetName="brs"
                                               Storyboard.TargetProperty="(LinearGradientBrush.GradientStops)[1].(GradientStop.Offset)"
                                               RepeatBehavior="35"
                                               AutoReverse="True">
                    <EasingDoubleKeyFrame KeyTime="0:0:0" Value="0.2"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:10" Value="0.8">
                        <EasingDoubleKeyFrame.EasingFunction>
                            <ElasticEase Oscillations="4" Springiness="1"/>
                        </EasingDoubleKeyFrame.EasingFunction>
                    </EasingDoubleKeyFrame>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>
        </Grid.Resources>
    </Grid>

 

在gridLoaded上右击,从弹出的菜单中选择“导航到事件处理程序”,在生成的方法中完成以下C#代码。

        private void gridLoaded(object sender, RoutedEventArgs e)
        {
            std.Begin();
        }

 

运行程序后,你会看到渐变填充中间黄色的色块在左右来回移动。

 

 

 

演练三:

请参照以下XAML建立UI。

<phone:PhoneApplicationPage
    x:Class="Sample.Page3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot 是包含所有页面内容的根网格-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel 包含应用程序的名称和页标题-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="页面名称" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - 在此处放置其他内容-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Rectangle HorizontalAlignment="Left" VerticalAlignment="Bottom"
                       Width="60" Height="45" Fill="White"
                       MouseLeftButtonDown="onShow"/>
            <TextBlock HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Text="请点击左下角的白色矩形。"
                       TextWrapping="Wrap"
                       Margin="30,0,40,0"
                       FontSize="45"/>
            <StackPanel x:Name="sp" Background="LightBlue"
                        Height="180"
                        VerticalAlignment="Bottom">
                <TextBlock Foreground="Red"
                           Margin="20,22,20,20"
                           FontSize="32"
                           Text="你好,点击下面的按钮吧。"/>
                <Button Content="确    定" Background="Blue"
                        Click="onHide"/>
                <StackPanel.RenderTransform>
                    <TranslateTransform x:Name="trm"
                                        Y="180"/>
                </StackPanel.RenderTransform>
            </StackPanel>

            <Grid.Resources>
                <Storyboard x:Name="stdShow">
                    <DoubleAnimationUsingKeyFrames
                        Storyboard.TargetName="trm"
                        Storyboard.TargetProperty="Y"
                        Duration="1">
                        <EasingDoubleKeyFrame
                            KeyTime="0:0:0" Value="180"/>
                        <EasingDoubleKeyFrame
                            KeyTime="0:0:1" Value="0">
                            <EasingDoubleKeyFrame.EasingFunction>
                                <PowerEase Power="10"/>
                            </EasingDoubleKeyFrame.EasingFunction>
                        </EasingDoubleKeyFrame>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>

                <Storyboard x:Name="stdHide">
                    <DoubleAnimationUsingKeyFrames
                        Duration="0:0:1"
                        Storyboard.TargetName="trm"
                        Storyboard.TargetProperty="Y">
                        <EasingDoubleKeyFrame KeyTime="0:0:0"
                                              Value="0"/>
                        <EasingDoubleKeyFrame KeyTime="0:0:1"
                                              Value="180">
                            <EasingDoubleKeyFrame.EasingFunction>
                                <PowerEase Power="10"/>
                            </EasingDoubleKeyFrame.EasingFunction>
                        </EasingDoubleKeyFrame>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </Grid.Resources>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

分别在onShow和onHide方法上右击,从弹出的菜单中选择“导航到事件处理程序”,完成后台代码逻辑。

        private void onShow(object sender, MouseButtonEventArgs e)
        {
            if (stdHide.GetCurrentState() != ClockState.Stopped)
            {
                stdHide.Stop();
            }
            stdShow.Begin();
        }

        private void onHide(object sender, RoutedEventArgs e)
        {
            if (stdShow.GetCurrentState() != ClockState.Stopped)
            {
                stdShow.Stop();
            }
            stdHide.Begin();
        }

 

现在,运行程序,单击屏幕左下方的白色矩形,这时候屏幕下方会弹出一个面板,再点击面板上的按钮,面板会缩下去。

这样,使用动画,我们就做出了一个类似工具条的效果。

 

     

 

时间: 2024-12-25 00:26:05

Windows Phone开发(42):缓动动画的相关文章

WPF界面设计技巧(7)—模拟电梯升降的缓动动画

原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画     如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这种动画忽略了移动开始时的加速过程与移动结束时的减速过程.   WPF在关键帧动画中提供了样条内插(Spline)型的关键帧,用以控制变化的速率曲线,但这东西实在有些复杂,且不够形象化,我研究很久也没明白如何实现"缓入--缓出"的效果,随后我从一本经典牛X却鲜有人知的过时的Flash

Windows 8 Store Apps学习(19) 动画 线性动画, 关键帧动画, 缓动动画

介绍 重新想象 Windows 8 Store Apps 之 动画 线性动画 - 共有 3 种: ColorAnimation, DoubleAnimation, PointAnimation, 它们均继承自 Timeline 关键帧动画 - 共有 4 种:ColorAnimationUsingKeyFrames, DoubleAnimationUsingKeyFrames, PointAnimationUsingKeyFrames, ObjectAnimationUsingKeyFrames

背水一战 Windows 10 (15) - 动画: 缓动动画

原文:背水一战 Windows 10 (15) - 动画: 缓动动画 [源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing)的应用Animation/EasingAnimation.xaml <Page x:Class="Windows10.Animation.EasingAnimation" xmlns="http://s

重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画

原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 动画 线性动画 - 共有 3 种: ColorAnimation, DoubleAnimation, PointAnimation, 它们均继承自 Timeline 关键帧动画

jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween_jquery

在jQuery内部函数Animation中调用到了createTweens()来创建缓动动画组,创建完成后的结果为: 可以看到上面的缓动动画组有四个原子动画组成.每一个原子动画的信息都包含在里面了. 仔细查看createTweens函数,实际上就是遍历调用了tweeners ["*"]的数组中的函数(实际上就只有一个元素). function createTweens( animation, props ) { jQuery.each( props, function( prop, v

Flash/Flex学习笔记(38):缓动动画

缓动 与 匀变速 看上去很类似,但其实有区别: 匀变速的公式为 V = V0 + at --速度v与时间t是线性(正比)关系,而且这种运动不需要确定目标点,速度可以按照这种规律一直变下去 而缓动指的是物体越接近目标时速度越慢,速度跟距离成反比关系,用公式描述为 V = k S  (0<k<1),这种运动需要先确定一个目标点,比如车辆定点停车:先指定一个位置,然后汽车从远处开过来,快到停车点时,逐渐慢下来,直到准确停在指定位置. 先看个演示: 代码: package { import flash

Windows Phone开发(39):漫谈关键帧动画上篇

原文:Windows Phone开发(39):漫谈关键帧动画上篇 尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅仅针对两个值的目标值之间产生动画,如果使用By,将在原值和加上By后的目标值之间进行动画处理:如果使用From,To,那就更好理解了,就是首尾两个值之间值的动画. 那么,如果我希望三个值呢?或者N多个值呢?每个值之间的时间间隔不一样呢?如果我还希望更复杂的动画效果呢?比如可以附加缓动函数的.显然,前

iOS 基本动画、关键帧动画、利用缓动函数实现物理动画效果_IOS

iOS基本动画/关键帧动画/利用缓动函数实现物理动画效果 先说下基本动画部分 基本动画部分比较简单, 但能实现的动画效果也很局限 使用方法大致为: #1. 创建原始UI或者画面 #2. 创建CABasicAnimation实例, 并设置keypart/duration/fromValue/toValue #3. 设置动画最终停留的位置 #4. 将配置好的动画添加到layer层中 举个例子, 比如实现一个圆形从上往下移动, 上代码: //设置原始画面 UIView *showView = [[UI

js-JS怎么通过缓动公式画描述速度的贝塞尔曲线

问题描述 JS怎么通过缓动公式画描述速度的贝塞尔曲线 就是我想做一个缓动动画的demo 两个画布 上面那个有小块再做相应的缓动运动 下面画布画出相应描述速度变化的曲线 求教如果知道了缓动运动公式怎么画这个缓动动画相应的曲线呢? 解决方案 切换 .fontsmall { font-size: 12px; color:red; } .fontmax { font-size: 72px; color:blue; } $(document).ready(function(){ $("#changefon