精华内容
下载资源
问答
  • animation

    千次阅读 2018-09-03 13:15:17
    animation: name duration timing-function delay iteration-count direction fill-mode play-state ; 定义和用法 animation 属性是一个简写属性,用于设置六个动画属性: animation-name ...

    这个属性是css3里的,具体的浏览器兼容性大家可以去Can I Use里面查看。

    语法

    animation: name duration timing-function delay iteration-count direction fill-mode play-state ; 
    

    定义和用法

    animation 属性是一个简写属性,用于设置六个动画属性:
    animation-name       规定需要绑定到选择器的 keyframe 名称。
    animation-duration   规定完成动画所花费的时间,以秒或毫秒计。
    animation-timing-function   规定动画的速度曲线。
    animation-delay       规定在动画开始之前的延迟。
    animation-iteration-count   规定动画应该播放的次数。
    animation-direction  规定是否应该轮流反向播放动画。
    animation-fill-mode   规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。animation-play-state  指定动画是否正在运行或已暂停。
    注释:请始终规定 animation-duration 属性,否则时长为 0,就不会播放动画了。
    

    animation-timing-function

    animation-duration、animation-timing-function、animation-delay和transition里面的transition-duration、transition-timing-function、transition-delay功能一样就不再多说了。
    但是animation-timing-function属性里animation比transition多一个steps取值,steps函数可以实现分步过渡。steps 函数指定了一个阶跃函数,第一个参数指定了时间函数中的间隔数量(必须是正整数);第二个参数可选,接受 start 和 end 两个值,指定在每个间隔的起点或是终点发生阶跃变化,默认为 end。
    这里写图片描述
    这里有一个例子,可以看到steps函数的用处:steps.html
    还可以参考:steps()用法详解

    animation-name

    animation-name属性是指keyframes关键字定义的名称。比如:

    div:hover {
      animation: 1s rainbow;
    }
    

    当鼠标悬停在div元素上时,会产生名为rainbow的动画效果,持续时间为1秒。然后我们定义rainbow效果:

    @keyframes rainbow {
      0% { background: #c00; }
      50% { background: orange; }
      100% { background: yellowgreen; }
    }
    

    rainbow效果一共有三个状态,分别为起始(0%)、中点(50%)和结束(100%)。如果有需要,还可以插入更多状态。参考实例:animation.html

    keyframes

    keyframes关键字写法还可以这样写:

    @keyframes rainbow {
      from { background: #c00 }
      50% { background: orange }
      to { background: yellowgreen }
    }
    

    from代表0%,to代表100%。还可以省略某个状态,浏览器会自动推算中间状态:

    @keyframes rainbow {
      50% { background: orange }
      to { background: yellowgreen }
    }
    
    @keyframes rainbow {
      to { background: yellowgreen }
    }
    

    甚至,可以把多个状态写在一行:

    @keyframes pound {
      from,to { transform: none; }
      50% { transform: scale(1.2); }
    }
    

    animation-iteration-count

    默认情况下,动画只播放一次。加入infinite关键字,可以让动画无限次播放。

    div:hover {  
        animation: 1s rainbow infinite;
    }
    

    也可以指定动画具体播放的次数:

    div:hover {
        animation: 1s rainbow 3;
    }
    

    这里还有一个心脏跳动的例子。

    animation-direction

    动画循环播放时,每次都是从结束状态跳回到起始状态,再开始播放。animation-direction属性,可以改变这种行为。默认情况是,animation-direction等于normal:

        div:hover {
          animation: 1s rainbow 3 normal;
        }
    

    animation-direction可以取以下值:
    这里写图片描述

    animation-fill-mode

    动画结束以后,会立即从结束状态跳回到起始状态。如果想让动画保持在结束状态,可以使用animation-fill-mode属性。注意这个属性可以不用在动画的循环播放中,而animation-direction属性一般用在动画的循环播放中:

    div:hover {
      animation: 1s rainbow forwards;
    }
    

    animation-fill-mode可以使用下列值:

    1. none:默认值,回到动画没开始时的状态。
    2. forwards: 当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)。
    3. backwards:让动画回到第一帧的状态。
    4. both: 根据animation-direction轮流应用forwards和backwards规则。

    animation

    transition一样,animation也是一个简写形式。各个属性的顺序也可以更改,但是animation-duration和animation-delay这两个属性之间的顺序必须是一前一后。

    div:hover {
      animation: 1s 1s rainbow linear 3 forwards normal;
    }
    

    animation-play-state

    规定动画正在运行还是暂停。有时,动画播放过程中,会突然停止。这时,默认行为是跳回到动画的开始状态。如果想让动画保持突然终止时的状态,就要使用animation-play-state属性。它有两个取值paused(停止)、running(运行)。
    参考实例:animation1.html

    总结

    目前,IE 10和Firefox(>= 16)支持没有前缀的animation,而chrome不支持,所以必须使用webkit前缀:

    div:hover {
      -webkit-animation: 1s rainbow;
      animation: 1s rainbow;  
    }
    
    @-webkit-keyframes rainbow {
      0% { background: #c00; }
      50% { background: orange; }
      100% { background: yellowgreen; }
    }
    
    @keyframes rainbow {
      0% { background: #c00; }
      50% { background: orange; }
      100% { background: yellowgreen; }
    }
    
    展开全文
  • CSS3(三)Animation 入门详解

    万次阅读 多人点赞 2018-04-17 16:07:44
    Animation 前言 好的前端工程师,会更注重用户的体验和交互。那么动画就是将我们的静态页面,变成具有灵动性,为我们的界面添加个性的一种方式。 下面是七喜的官方主页,它就是很好的富交互样例。鼠标移动...

    Animation


    前言

    个人github: https://github.com/robbiemie 欢迎star&follow ~

    好的前端工程师,会更注重用户的体验和交互。那么动画就是将我们的静态页面,变成具有灵动性,为我们的界面添加个性的一种方式。

    下面是七喜的官方主页,它就是很好的富交互样例。鼠标移动到导航栏,就会播放多种动效,给用户一种酷炫的体验。我觉得用户体验,才是前端工程师更加关注的问题,而不是一味追求Javascript的编码技能。

    这里写图片描述
    七喜官方网站

    个人网站

    Github 源码(欢迎Fork~~)


    Animation 组成

    CSS3 Animation 是由三部分组成。


    1.关键帧(@keyframes)

    • 关键帧(keyframes) - 定义动画在不同阶段的状态。
    • 动画属性(properties) - 决定动画的播放时长,播放次数,以及用何种函数式去播放动画等。(可以类比音视频播放器)
    • css属性 - 就是css元素不同关键帧下的状态。

    下面我们来看一个例子。
    创建了一个@keyframes命名为dropdown。

    • 关键帧主要分为3个阶段,0%、50%、100%。
    • 动画播放时长为6s、循环播放(infinite)、以linear方式进行播放。
    • 修改的元素属性为margin-top
    .list div:first-child {
     animation: dropdown 8s linear infinite;
    }
    @keyframes dropdown {
        0% { margin-top: 0px;}
       /** 暂停效果 */
       10% { margin-top: 0px;}
       50% { margin-top: -100px;}
       60% { margin-top: -100px;}
       90% { margin-top: -200px;}
      100% { margin-top: -200px;}
    }
    

    这里写图片描述

    查看源码
    MDN参考网站


    需要注意!当属性的个数不确定时:

    当我们在定义不同关键帧,元素属性的个数是一个变化的值。
    如果一个关键帧的属性,没有出现在其他关键帧的时候,那么这些属性将会使用上一帧的默认值。
    区别在于,缺省之后的渐变效果是不会出现的。比如下面两种写法,

      @keyframes dropdown {
        0% { top: 0; }
        30% { top: 300px; }
        50% { top: 150px; }
        70% { top: 300px; }
        80% { top: 0px;  left:-200px;}
        100% { top: 0px;  }
      }
    
    

    这里写图片描述

      @keyframes dropdown {
        0% { top: 0; left:0px;}
        30% { top: 300px; left:0px;}
        50% { top: 150px; left:0px;}
        70% { top: 300px; left:0px;}
        80% { top: 0px;  left:-200px;}
        100% { top: 0px;  left:0px;}
      }
    

    这里写图片描述


    语法

    @keyframes keyframes-name {
    [ [ from | to | <百分比> ] [, from | to | <百分比> ]* block ]*
    }
    keyframes-name
    帧列表的名称。 名称必须符合 CSS 语法中对标识符的定义。
    from
    等效于 0%.
    to
    等效于 100%.

    2.动画属性

    动画属性可以理解为播放器的相关功能,一个最基本的播放器应该具有:播放/暂停、播放时长、播放顺序(逆序/正序/交替播放)、循环次数等。
    主要也分为两大点:

    • 指定播放的元素
    • 定义播放信息的配置
      这里写图片描述

    动画源码

    简写属性形式:

    animation:
    [animation-name] [animation-duration] // 动画的名称、持续时间
    [animation-timing-function][animation-delay] // 关于时间的函数(properties/t)、延迟时间
    [animation-iteration-count] [animation-direction] // 播放次数、播放顺序
    [animation-fill-mode] [animation-play-state]; // 播放前或停止后设置相应样式、控制动画运行或暂停

    MDN参考文档

    1.时间函数(animation-timing-function)

    animation-timing-function属性定义了动画的播放速度曲线。
    可选配置参数为:
    ease
    ease-in
    ease-out
    ease-in-out
    linear
    cubic-bezier(number, number, number, number)
    这里写图片描述
    动画源码
    默认值,如果没有显示写调用的函数,则默认为ease。

    2.动画方向(animation-direction)

    animation-direction属性表示CSS动画是否反向播放。
    可选配置参数为:

    single-animation-direction = normal | reverse | alternate | alternate-reverse

    • animation-direction: normal 正序播放
    • animation-direction: reverse 倒序播放
    • animation-direction: alternate 交替播放
    • animation-direction: alternate-reverse 反向交替播放
    • animation-direction: normal, reverse
    • animation-direction: alternate, reverse, normal

    这里写图片描述

    动画源码
    MDN文档

    3.动画延迟(animation-delay)

    animation-delay属性定义动画是从何时开始播放,即动画应用在元素上的到动画开始的这段时间的长度。
    默认值0s,表示动画在该元素上后立即开始执行。
    该值以秒(s)或者毫秒(ms)为单位。

    4.动画迭代次数(animation-iteration-count)

    animation-iteration-count该属性就是定义我们的动画播放的次数。次数可以是1次或者无限循环。
    默认值只播放一次。

    single-animation-iteration-count = infinite | number

    5.动画填充模式(animation-fill-mode)

    animation-fill-mode是指给定动画播放前后应用元素的样式。

    single-animation-fill-mode = **none **| **forwards **| **backwards **| both

    • animation-fill-mode: none 动画执行前后不改变任何样式
    • animation-fill-mode: forwards 保持目标动画最后一帧的样式
    • animation-fill-mode: backwards 保持目标动画第一帧的样式
    • animation-fill-mode: both 动画将会执行 forwards 和 backwards 执行的动作。
    6.动画播放状态(animation-timing-function)

    animation-play-state: 定义动画是否运行或者暂停。可以确定查询它来确定动画是否运行。
    默认值为running

    single-animation-timing-function = running | paused

    • running 动画正常播放
    • paused 动画暂停播放

    个人github: https://github.com/robbiemie 欢迎star&follow ~

    相关链接

    个人网站
    Github 源码

    SVG动画实践

    动画实践

    分享一些CSS3动效网站:

    Animation.css 一个很全的CSS3的动效库,可以尝试看看源码进行学习。
    CreateJS 里面的特效做得也很不错,有很多酷炫的样例。
    国外css3网页 布局很优雅的网站
    USAToday 也是一个很酷炫的国外网站
    peekabeat 很清爽的界面
    heartbeat 交互很棒的网站
    dances 貌似是交响乐的网站主页
    reative 很有时代感的网站
    animation 在线animation编辑器

    这里写图片描述

    展开全文
  • Core Animation

    2018-12-06 21:31:59
    Core AnimationCore Animation
  • Animation按钮

    2017-12-28 21:39:52
    Animation按钮 Animation按钮
  • Animation 动画详解

    2018-04-08 13:53:07
    Animation 动画详解 Animation 动画详解 Animation 动画详解Animation 动画详解Animation 动画详解Animation 动画详解
  • Animation动画的解析与自定义Animation动画
  • Android应用源码之animation1(_animation
  • Frame Animation

    2015-01-15 12:06:03
    基本动画案例:Tween Animation, Frame Animation,介绍参考:http://blog.csdn.net/forwardyzk/article/details/42739281
  • Animation动画

    万次阅读 2015-11-12 01:22:00
    首先介绍一下Animation: 1.Animation 动画类型 Android的animation由四种类型组成: XML中 alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转...

    首先介绍一下Animation:

    1.Animation 动画类型

    Android的animation由四种类型组成:

    XML中

    alph渐变透明度动画效果
    scale渐变尺寸伸缩动画效果
    translate画面转换位置移动动画效果
    rotate画面转移旋转动画效果

     

     

     

     

     

    JavaCode中

    AlphaAnimation渐变透明度动画效果
    ScaleAnimation渐变尺寸伸缩动画效果
    TranslateAnimation画面转换位置移动动画效果
    RotateAnimation画面转移旋转动画效果

     

     

     

     

     2.Android动画模式

    Animation主要有两种动画模式:

    一种是tweened animation(渐变动画)

    XML中JavaCode
    alphaAlphaAnimation
    scaleScaleAnimation

     

     

     

    一种是frame by frame(画面转换动画)

    XML中JavaCode
    translateTranslateAnimation
    rotateRotateAnimation

     

     

     

    下面我们将用Java代码来实现这些动画,并且,可以通过手动输入参数去改变动画;

    先看效果图:

     

     

    由于之前动图传到的是360云盘。。。所以现在动图看不了了。。。。

    我将四种动画写在了一个工具类中(注释的很详细了)

    AnimationTools.java:

    package com.soft.util;
    
    import android.view.animation.AlphaAnimation;
    import android.view.animation.Animation;
    import android.view.animation.AnimationSet;
    import android.view.animation.RotateAnimation;
    import android.view.animation.ScaleAnimation;
    import android.view.animation.TranslateAnimation;
    
    /**
     * @author zml2015
     * @date 2015-11-11 下午9:39:33
     * @version 1.0
     */
    public class AnimationTools {
    
    	/**
    	 * @param fromAlpha
    	 *            开始的透明度
    	 * @param toAlpha
    	 *            到大的透明度
    	 * @param durationMillis
    	 *            动画持续时间
    	 * @return
    	 */
    	public static AnimationSet alphaAnimation(float fromAlpha, float toAlpha,
    			long durationMillis) {
    		// true表示使用Animation的interpolator,false则是使用自己的
    		AnimationSet set = new AnimationSet(true);
    
    		Animation alpha = new AlphaAnimation(fromAlpha, toAlpha);
    
    		alpha.setDuration(durationMillis);
    		set.addAnimation(alpha);
    		return set;
    
    	}
    
    	/**
    	 * @param fromDegrees
    	 *            :从哪个旋转角度开始
    	 * @param toDegrees
    	 *            :转到什么角度
    	 * @param pivotXValue
    	 *            : x轴的值,0.5f表明是以自身这个控件的一半长度为x轴
    	 * @param pivotYValue
    	 *            :y轴的值,0.5f表明是以自身这个控件的一半长度为y轴
    	 * @param durationMillis
    	 *            动画持续时间
    	 * @return AnimationSet
    	 */
    	public static AnimationSet rotateAnimation(float fromDegrees,
    			float toDegrees, float pivotXValue, float pivotYValue,
    			long durationMillis) {
    		AnimationSet set = new AnimationSet(true);
    
    		// Animation.RELATIVE_TO_SELF==1;
    		// Animation.RELATIVE_TO_PARENTS==2;
    		// 后4个参数用于设置围绕着旋转的圆的圆心在哪里
    		Animation rotate = new RotateAnimation(fromDegrees, toDegrees, 1,
    				pivotXValue, 1, pivotYValue);
    		rotate.setDuration(durationMillis);
    		set.addAnimation(rotate);
    		return set;
    	}
    
    	/**
    	 * @param fromX
    	 *            x轴的初始值
    	 * @param toX
    	 *            x轴收缩后的值
    	 * @param fromY
    	 *            y轴的初始值
    	 * @param toY
    	 *            y轴收缩后的值
    	 * @param pivotXValue
    	 *            x轴的值,0.5f表明是以自身这个控件的一半长度为x轴
    	 * @param pivotYValue
    	 *            y轴的值,0.5f表明是以自身这个控件的一半长度为y轴
    	 * @param durationMillis
    	 *            动画持续时间
    	 * @return AnimationSet
    	 */
    	public static AnimationSet scaleAnimation(float fromX, float toX,
    			float fromY, float toY, float pivotXValue, float pivotYValue,
    			long durationMillis) {
    		AnimationSet set = new AnimationSet(true);
    
    		// Animation.RELATIVE_TO_SELF==1;
    		// Animation.RELATIVE_TO_PARENTS==2;
    		Animation sacle = new ScaleAnimation(fromX, toX, fromY, toY, 1,
    				pivotXValue, 1, pivotYValue);
    		sacle.setDuration(durationMillis);
    		set.addAnimation(sacle);
    		return set;
    	}
    
    	/**
    	 * @param fromXValue
    	 *            x轴的开始位置
    	 * @param toXValue
    	 *            x轴的结束位置
    	 * @param fromYValue
    	 *            y轴的开始位置
    	 * 
    	 * @param toYValue
    	 *            y轴的结束位置
    	 * @param durationMillis
    	 *            动画持续时间
    	 * @return AnimationSet
    	 */
    	public static AnimationSet translateAnimation(float fromXValue,
    			float toXValue, float fromYValue, float toYValue,
    			long durationMillis) {
    		AnimationSet set = new AnimationSet(true);
    
    		// Animation.RELATIVE_TO_SELF==1;
    		// Animation.RELATIVE_TO_PARENTS==2;
    		Animation translate = new TranslateAnimation(1, fromXValue, 1,
    				toXValue, 1, fromYValue, 1, toYValue);
    		translate.setDuration(durationMillis);
    		set.addAnimation(translate);
    		return set;
    	}
    }
    


    布局文件main.xml

    <span style="font-size:18px;"><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            tools:context="com.zml.animation.MainActivity" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <EditText
                    android:id="@+id/editText1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="持续时间(ms)"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/editText2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="开始状态(0~1)"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/editText3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="终止状态(0~1)"
                    android:numeric="decimal" >
    
                    <requestFocus />
                </EditText>
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <EditText
                    android:id="@+id/et_rotate1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="旋转角度开始"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_rotate2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="旋转角度结束"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_rotate3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="x轴的值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_rotate4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="y轴的值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_rotate5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="持续时间"
                    android:numeric="decimal" />
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <EditText
                    android:id="@+id/et_scale1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="X轴初值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_scale2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="X收缩后的值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_scale3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="Y轴初值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_scale4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="Y收缩后的值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_scale5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="x轴位置"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_scale6"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="y轴位置"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_scale7"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="时间"
                    android:numeric="decimal" />
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <EditText
                    android:id="@+id/et_trans1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="X轴初值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_trans2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="X移动后的值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_trans3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="Y轴初值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_trans4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="Y移动后的值"
                    android:numeric="decimal" />
    
                <EditText
                    android:id="@+id/et_trans5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:ems="10"
                    android:hint="时间"
                    android:numeric="decimal" />
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
    
                <Button
                    android:id="@+id/alphaButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="淡入淡出" />
    
                <Button
                    android:id="@+id/rotateButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="旋转" />
    
                <Button
                    android:id="@+id/scaleButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="缩放" />
    
                <Button
                    android:id="@+id/translateButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="移动" />
            </LinearLayout>
    
            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/dog" />
        </LinearLayout>
    
    </ScrollView></span>


    主页面管理文件(注释虽然比较少,但是写的还是比较简单明了的)

    MainActivity.java

     

    package com.zml.animation;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import com.soft.util.AnimationTools;
    
    public class MainActivity extends Activity implements OnClickListener {
    	private Button alphaButton = null;
    	private Button rotateButton = null;
    	private Button scaleButton = null;
    
    	private Button translateButton = null;
    	private EditText et_alpha1, et_alpha2, et_alpha3, et_rotate1, et_rotate2,
    			et_rotate3, et_rotate4, et_rotate5, et_scale1, et_scale2,
    			et_scale3, et_scale4, et_scale5, et_scale6, et_scale7, et_trans1,
    			et_trans2, et_trans3, et_trans4, et_trans5;
    	private ImageView iv_show;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		alphaButton = (Button) findViewById(R.id.alphaButton);
    		rotateButton = (Button) findViewById(R.id.rotateButton);
    		scaleButton = (Button) findViewById(R.id.scaleButton);
    		translateButton = (Button) findViewById(R.id.translateButton);
    		alphaButton.setOnClickListener(this);
    		rotateButton.setOnClickListener(this);
    		scaleButton.setOnClickListener(this);
    		translateButton.setOnClickListener(this);
    
    		et_alpha1 = (EditText) findViewById(R.id.editText1);
    		et_alpha2 = (EditText) findViewById(R.id.editText2);
    		et_alpha3 = (EditText) findViewById(R.id.editText3);
    
    		et_rotate1 = (EditText) findViewById(R.id.et_rotate1);
    		et_rotate2 = (EditText) findViewById(R.id.et_rotate2);
    		et_rotate3 = (EditText) findViewById(R.id.et_rotate3);
    		et_rotate4 = (EditText) findViewById(R.id.et_rotate4);
    		et_rotate5 = (EditText) findViewById(R.id.et_rotate5);
    
    		et_scale1 = (EditText) findViewById(R.id.et_scale1);
    		et_scale2 = (EditText) findViewById(R.id.et_scale2);
    		et_scale3 = (EditText) findViewById(R.id.et_scale3);
    		et_scale4 = (EditText) findViewById(R.id.et_scale4);
    		et_scale5 = (EditText) findViewById(R.id.et_scale5);
    		et_scale6 = (EditText) findViewById(R.id.et_scale6);
    		et_scale7 = (EditText) findViewById(R.id.et_scale7);
    
    		et_trans1 = (EditText) findViewById(R.id.et_trans1);
    		et_trans2 = (EditText) findViewById(R.id.et_trans2);
    		et_trans3 = (EditText) findViewById(R.id.et_trans3);
    		et_trans4 = (EditText) findViewById(R.id.et_trans4);
    		et_trans5 = (EditText) findViewById(R.id.et_trans5);
    
    		iv_show = (ImageView) findViewById(R.id.imageView1);
    
    	}
    
    	@Override
    	public void onClick(View arg0) {
    		switch (arg0.getId()) {
    		case R.id.alphaButton:
    			if (et_alpha1.getText().toString().isEmpty()
    					|| et_alpha2.getText().toString().isEmpty()
    					|| et_alpha3.getText().toString().isEmpty())
    				Toast.makeText(MainActivity.this, "淡入淡出内容未填完整", 0).show();
    			else {
    				float fromAlpha = Float.parseFloat(et_alpha2.getText()
    						.toString());
    				float toAlpha = Float
    						.parseFloat(et_alpha3.getText().toString());
    				long durationMillis = Long.parseLong(et_alpha1.getText()
    						.toString());
    
    				iv_show.startAnimation(AnimationTools.alphaAnimation(fromAlpha,
    						toAlpha, durationMillis));
    			}
    			break;
    		case R.id.rotateButton:
    			if (et_rotate1.getText().toString().isEmpty()
    					|| et_rotate2.getText().toString().isEmpty()
    					|| et_rotate3.getText().toString().isEmpty()
    					|| et_rotate4.getText().toString().isEmpty()
    					|| et_rotate5.getText().toString().isEmpty())
    				Toast.makeText(MainActivity.this, "旋转内容未填完整", 0).show();
    			else {
    				float fromDegrees = Float.parseFloat(et_rotate1.getText()
    						.toString());
    				float toDegrees = Float.parseFloat(et_rotate2.getText()
    						.toString());
    				float pivotXValue = Float.parseFloat(et_rotate3.getText()
    						.toString());
    				float pivotYValue = Float.parseFloat(et_rotate4.getText()
    						.toString());
    				long rdurationMillis = Long.parseLong(et_rotate5.getText()
    						.toString());
    				iv_show.startAnimation(AnimationTools.rotateAnimation(
    						fromDegrees, toDegrees, pivotXValue, pivotYValue,
    						rdurationMillis));
    			}
    			break;
    		case R.id.scaleButton:
    			if (et_scale1.getText().toString().isEmpty()
    					|| et_scale2.getText().toString().isEmpty()
    					|| et_scale3.getText().toString().isEmpty()
    					|| et_scale4.getText().toString().isEmpty()
    					|| et_scale5.getText().toString().isEmpty()
    					|| et_scale6.getText().toString().isEmpty()
    					|| et_scale7.getText().toString().isEmpty())
    				Toast.makeText(MainActivity.this, "收缩内容未填完整", 0).show();
    			else {
    				float fromX = Float.parseFloat(et_scale1.getText().toString());
    				float toX = Float.parseFloat(et_scale2.getText().toString());
    				float fromY = Float.parseFloat(et_scale3.getText().toString());
    				float toY = Float.parseFloat(et_scale4.getText().toString());
    				float spivotXValue = Float.parseFloat(et_scale5.getText()
    						.toString());
    				float spivotYValue = Float.parseFloat(et_scale6.getText()
    						.toString());
    				long sdurationMillis = Long.parseLong(et_scale7.getText()
    						.toString());
    				iv_show.startAnimation(AnimationTools.scaleAnimation(fromX,
    						toX, fromY, toY, spivotXValue, spivotYValue,
    						sdurationMillis));
    			}
    			break;
    		case R.id.translateButton:
    			if (et_trans1.getText().toString().isEmpty()
    					|| et_trans2.getText().toString().isEmpty()
    					|| et_trans3.getText().toString().isEmpty()
    					|| et_trans4.getText().toString().isEmpty()
    					|| et_trans5.getText().toString().isEmpty())
    				Toast.makeText(MainActivity.this, "收缩内容未填完整", 0).show();
    			else {
    				float fromXValue = Float.parseFloat(et_trans1.getText()
    						.toString());
    				float toXValue = Float.parseFloat(et_trans2.getText()
    						.toString());
    				float fromYValue = Float.parseFloat(et_trans3.getText()
    						.toString());
    				float toYValue = Float.parseFloat(et_trans4.getText()
    						.toString());
    				long tsdurationMillis = Long.parseLong(et_trans5.getText()
    						.toString());
    				iv_show.startAnimation(AnimationTools.translateAnimation(
    						fromXValue, toXValue, fromYValue, toYValue,
    						tsdurationMillis));
    			}
    			break;
    		default:
    			break;
    		}
    
    	}
    
    }
    


     源码下载地址:CSDN(暂未上传)

     

     
    展开全文
  • textAnimation 使用CSS和HTML的textAnimation
  • Android 属性动画(Property Animation) 完全解析 (上)

    万次阅读 多人点赞 2014-07-25 09:34:10
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/380674751、概述Android提供了几种...View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475

    1、概述

    Android提供了几种动画类型:View Animation 、Drawable Animation 、Property Animation 。View Animation相当简单,不过只能支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性。比如:你希望View有一个颜色的切换动画;你希望可以使用3D旋转动画;你希望当动画停止时,View的位置就是当前的位置;这些View Animation都无法做到。这就是Property Animation产生的原因,本篇博客详细介绍Property Animation的用法。至于Drawable Animation,嗯,略~

    2、相关API

    Property Animation故名思议就是通过动画的方式改变对象的属性了,我们首先需要了解几个属性:

    Duration动画的持续时间,默认300ms。

    Time interpolation:时间差值,乍一看不知道是什么,但是我说LinearInterpolator、AccelerateDecelerateInterpolator,大家一定知道是干嘛的了,定义动画的变化率。

    Repeat count and behavior:重复次数、以及重复模式;可以定义重复多少次;重复时从头开始,还是反向。

    Animator sets: 动画集合,你可以定义一组动画,一起执行或者顺序执行。

    Frame refresh delay:帧刷新延迟,对于你的动画,多久刷新一次帧;默认为10ms,但最终依赖系统的当前状态;基本不用管。

    相关的类

    ObjectAnimator  动画的执行类,后面详细介绍

    ValueAnimator 动画的执行类,后面详细介绍 

    AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。

    AnimatorInflater 用户加载属性动画的xml文件

    TypeEvaluator  类型估值,主要用于设置动画操作属性的值。

    TimeInterpolator 时间插值,上面已经介绍。

    总的来说,属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。

    3、ObjectAnimator实现动画

    之所以选择ObjectAnimator为第一个~~是因为,这个实现最简单~~一行代码,秒秒钟实现动画,下面看个例子:
    布局文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/id_container" >
    
        <ImageView
            android:id="@+id/id_ball"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@drawable/mv" 
            android:scaleType="centerCrop"
            android:onClick="rotateyAnimRun"
            />
    
    </RelativeLayout>

    很简单,就一张妹子图片~
    Activity代码:

    package com.example.zhy_property_animation;
    
    import android.animation.ObjectAnimator;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    
    public class ObjectAnimActivity extends Activity
    {
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.xml_for_anim);
    	}
    
    	public void rotateyAnimRun(View view)
    	{
    		 ObjectAnimator//
    		 .ofFloat(view, "rotationX", 0.0F, 360.0F)//
    		 .setDuration(500)//
    		 .start();
    	}
    
    }
    

    效果:

    是不是一行代码就能实现简单的动画~~

    对于ObjectAnimator

    1、提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。

    当对于属性值,只设置一个的时候,会认为当然对象该属性的值为开始(getPropName反射获取),然后设置的值为终点。如果设置两个,则一个为开始、一个为结束~~~

    动画更新的过程中,会不断调用setPropName更新元素的属性,所有使用ObjectAnimator更新某个属性,必须得有getter(设置一个属性值的时候)和setter方法~

    2、如果你操作对象的该属性方法里面,比如上例的setRotationX如果内部没有调用view的重绘,则你需要自己按照下面方式手动调用。

    anim.addUpdateListener(new AnimatorUpdateListener()
    		{
    			@Override
    			public void onAnimationUpdate(ValueAnimator animation)
    			{
    //				view.postInvalidate();
    //				view.invalidate();
    			}
    		});
    3、看了上面的例子,因为设置的操作的属性只有一个,那么如果我希望一个动画能够让View既可以缩小、又能够淡出(3个属性scaleX,scaleY,alpha),只使用ObjectAnimator咋弄?

    想法是不是很不错,可能会说使用AnimatorSet啊,这一看就是一堆动画塞一起执行,但是我偏偏要用一个ObjectAnimator实例实现呢~下面看代码:

    	public void rotateyAnimRun(final View view)
    	{
    		ObjectAnimator anim = ObjectAnimator//
    				.ofFloat(view, "zhy", 1.0F,  0.0F)//
    				.setDuration(500);//
    		anim.start();
    		anim.addUpdateListener(new AnimatorUpdateListener()
    		{
    			@Override
    			public void onAnimationUpdate(ValueAnimator animation)
    			{
    				float cVal = (Float) animation.getAnimatedValue();
    				view.setAlpha(cVal);
    				view.setScaleX(cVal);
    				view.setScaleY(cVal);
    			}
    		});
    	}

    把设置属性的那个字符串,随便写一个该对象没有的属性,就是不管~~咱们只需要它按照时间插值和持续时间计算的那个值,我们自己手动调用~

    效果:

    这个例子就是想说明一下,有时候换个思路不要被API所约束,利用部分API提供的功能也能实现好玩的效果~~~

    比如:你想实现抛物线的效果,水平方向100px/s,垂直方向加速度200px/s*s ,咋实现呢~~可以自己用ObjectAnimator试试~

    4、其实还有更简单的方式,实现一个动画更改多个效果:使用propertyValuesHolder

    public void propertyValuesHolder(View view)
    	{
    		PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
    				0f, 1f);
    		PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
    				0, 1f);
    		PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
    				0, 1f);
    		ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY,pvhZ).setDuration(1000).start();
    	}


     4、ValueAnimator实现动画

    和ObjectAnimator用法很类似,简单看一下用view垂直移动的动画代码:

    public void verticalRun(View view)
    	{
    		ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight
    				- mBlueBall.getHeight());
    		animator.setTarget(mBlueBall);
    		animator.setDuration(1000).start();
    	}

    给你的感觉是不是,坑爹啊,这和ValueAnimator有毛线区别~但是仔细看,你看会发现,没有设置操作的属性~~也就是说,上述代码是没有任何效果的,没有指定属性~

    这就是和ValueAnimator的区别之处:ValueAnimator并没有在属性上做操作,你可能会问这样有啥好处?我岂不是还得手动设置?

    好处:不需要操作的对象的属性一定要有getter和setter方法,你可以自己根据当前动画的计算值,来操作任何属性,记得上例的那个【我希望一个动画能够让View既可以缩小、又能够淡出(3个属性scaleX,scaleY,alpha)】吗?其实就是这么个用法~

    实例:

    布局文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:id="@+id/id_container"
      
        >
    
        <ImageView
            android:id="@+id/id_ball"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/bol_blue" />
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal" >
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="verticalRun"
                android:text="垂直" />
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="paowuxian"
                android:text="抛物线" />
    
        </LinearLayout>
    
    </RelativeLayout>
    左上角一个小球,底部两个按钮~我们先看一个自由落体的代码:

    /**
    	 * 自由落体
    	 * @param view
    	 */
    	public void verticalRun( View view)
    	{
    		ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight
    				- mBlueBall.getHeight());
    		animator.setTarget(mBlueBall);
    		animator.setDuration(1000).start();
    //		animator.setInterpolator(value)
    		animator.addUpdateListener(new AnimatorUpdateListener()
    		{
    			@Override
    			public void onAnimationUpdate(ValueAnimator animation)
    			{
    				mBlueBall.setTranslationY((Float) animation.getAnimatedValue());
    			}
    		});
    	}

    与ObjectAnimator不同的就是我们自己设置元素属性的更新~虽然多了几行代码,但是貌似提高灵活性~

    下面再来一个例子,如果我希望小球抛物线运动【实现抛物线的效果,水平方向100px/s,垂直方向加速度200px/s*s 】,分析一下,貌似只和时间有关系,但是根据时间的变化,横向和纵向的移动速率是不同的,我们该咋实现呢?此时就要重写TypeValue的时候了,因为我们在时间变化的同时,需要返回给对象两个值,x当前位置,y当前位置:

    代码:

    /**
    	 * 抛物线
    	 * @param view
    	 */
    	public void paowuxian(View view)
    	{
    
    		ValueAnimator valueAnimator = new ValueAnimator();
    		valueAnimator.setDuration(3000);
    		valueAnimator.setObjectValues(new PointF(0, 0));
    		valueAnimator.setInterpolator(new LinearInterpolator());
    		valueAnimator.setEvaluator(new TypeEvaluator<PointF>()
    		{
    			// fraction = t / duration
    			@Override
    			public PointF evaluate(float fraction, PointF startValue,
    					PointF endValue)
    			{
    				Log.e(TAG, fraction * 3 + "");
    				// x方向200px/s ,则y方向0.5 * 10 * t
    				PointF point = new PointF();
    				point.x = 200 * fraction * 3;
    				point.y = 0.5f * 200 * (fraction * 3) * (fraction * 3);
    				return point;
    			}
    		});
    
    		valueAnimator.start();
    		valueAnimator.addUpdateListener(new AnimatorUpdateListener()
    		{
    			@Override
    			public void onAnimationUpdate(ValueAnimator animation)
    			{
    				PointF point = (PointF) animation.getAnimatedValue();
    				mBlueBall.setX(point.x);
    				mBlueBall.setY(point.y);
    
    			}
    		});
    	}
    可以看到,因为ofInt,ofFloat等无法使用,我们自定义了一个TypeValue,每次根据当前时间返回一个PointF对象,(PointF和Point的区别就是x,y的单位一个是float,一个是int;RectF,Rect也是)PointF中包含了x,y的当前位置~然后我们在监听器中获取,动态设置属性:

    效果图:


    有木有两个铁球同时落地的感觉~~对,我应该搞两个球~~ps:物理公式要是错了,就当没看见哈

    自定义TypeEvaluator传入的泛型可以根据自己的需求,自己设计个Bean。

    好了,我们已经分别讲解了ValueAnimator和ObjectAnimator实现动画;二者区别;如何利用部分API,自己更新属性实现效果;自定义TypeEvaluator实现我们的需求;但是我们并没有讲如何设计插值,其实我觉得把,这个插值默认的那一串实现类够用了~~很少,会自己去设计个超级变态的~嗯~所以:略。

    5、监听动画的事件

    对于动画,一般都是一些辅助效果,比如我要删除个元素,我可能希望是个淡出的效果,但是最终还是要删掉,并不是你透明度没有了,还占着位置,所以我们需要知道动画如何结束。

    所以我们可以添加一个动画的监听:

    public void fadeOut(View view)
    	{
    		ObjectAnimator anim = ObjectAnimator.ofFloat(mBlueBall, "alpha", 0.5f);
    		
    		anim.addListener(new AnimatorListener()
    		{
    
    			@Override
    			public void onAnimationStart(Animator animation)
    			{
    				Log.e(TAG, "onAnimationStart");
    			}
    
    			@Override
    			public void onAnimationRepeat(Animator animation)
    			{
    				// TODO Auto-generated method stub
    				Log.e(TAG, "onAnimationRepeat");
    			}
    
    			@Override
    			public void onAnimationEnd(Animator animation)
    			{
    				Log.e(TAG, "onAnimationEnd");
    				ViewGroup parent = (ViewGroup) mBlueBall.getParent();
    				if (parent != null)
    					parent.removeView(mBlueBall);
    			}
    
    			@Override
    			public void onAnimationCancel(Animator animation)
    			{
    				// TODO Auto-generated method stub
    				Log.e(TAG, "onAnimationCancel");
    			}
    		});
    		anim.start();
    	}

    这样就可以监听动画的开始、结束、被取消、重复等事件~但是有时候会觉得,我只要知道结束就行了,这么长的代码我不能接收,那你可以使用AnimatorListenerAdapter

    		anim.addListener(new AnimatorListenerAdapter()
    		{
    			@Override
    			public void onAnimationEnd(Animator animation)
    			{
    				Log.e(TAG, "onAnimationEnd");
    				ViewGroup parent = (ViewGroup) mBlueBall.getParent();
    				if (parent != null)
    					parent.removeView(mBlueBall);
    			}
    		});

    AnimatorListenerAdapter继承了AnimatorListener接口,然后空实现了所有的方法~

    效果图:


    animator还有cancel()和end()方法:cancel动画立即停止,停在当前的位置;end动画直接到最终状态。

    6、AnimatorSet的使用

    实例:

    布局文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:id="@+id/id_container"
       
        >
    
        <ImageView
            android:id="@+id/id_ball"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:src="@drawable/bol_blue" />
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal" >
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="togetherRun"
                android:text="简单的多动画Together" />
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="playWithAfter"
                android:text="多动画按次序执行" />
            
    
        </LinearLayout>
    
    </RelativeLayout>

    继续玩球~

    代码:

    package com.example.zhy_property_animation;
    
    import android.animation.AnimatorSet;
    import android.animation.ObjectAnimator;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.animation.LinearInterpolator;
    import android.widget.ImageView;
    
    public class AnimatorSetActivity extends Activity
    {
    	private ImageView mBlueBall;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.anim_set);
    
    		mBlueBall = (ImageView) findViewById(R.id.id_ball);
    
    	}
    
    	public void togetherRun(View view)
    	{
    		ObjectAnimator anim1 = ObjectAnimator.ofFloat(mBlueBall, "scaleX",
    				1.0f, 2f);
    		ObjectAnimator anim2 = ObjectAnimator.ofFloat(mBlueBall, "scaleY",
    				1.0f, 2f);
    		AnimatorSet animSet = new AnimatorSet();
    		animSet.setDuration(2000);
    		animSet.setInterpolator(new LinearInterpolator());
    		//两个动画同时执行
    		animSet.playTogether(anim1, anim2);
    		animSet.start();
    	}
    
    	public void playWithAfter(View view)
    	{
    		float cx = mBlueBall.getX();
    
    		ObjectAnimator anim1 = ObjectAnimator.ofFloat(mBlueBall, "scaleX",
    				1.0f, 2f);
    		ObjectAnimator anim2 = ObjectAnimator.ofFloat(mBlueBall, "scaleY",
    				1.0f, 2f);
    		ObjectAnimator anim3 = ObjectAnimator.ofFloat(mBlueBall,
    				"x",  cx ,  0f);
    		ObjectAnimator anim4 = ObjectAnimator.ofFloat(mBlueBall,
    				"x", cx);
    		
    		/**
    		 * anim1,anim2,anim3同时执行
    		 * anim4接着执行
    		 */
    		AnimatorSet animSet = new AnimatorSet();
    		animSet.play(anim1).with(anim2);
    		animSet.play(anim2).with(anim3);
    		animSet.play(anim4).after(anim3);
    		animSet.setDuration(1000);
    		animSet.start();
    	}
    }
    

    写了两个效果:

    第一:使用playTogether两个动画同时执行,当然还有playSequentially依次执行~~

    第二:如果我们有一堆动画,如何使用代码控制顺序,比如1,2同时;3在2后面;4在1之前等~就是效果2了

    有一点注意:animSet.play().with();也是支持链式编程的,但是不要想着狂点,比如 animSet.play(anim1).with(anim2).before(anim3).before(anim5); 这样是不行的,系统不会根据你写的这一长串来决定先后的顺序,所以麻烦你按照上面例子的写法,多写几行:

    效果图:



    好了,由于篇幅~~关于属性动画还有点知识:

    1、xml文件创建属性动画

    2、布局动画

    3、View的animate方法等。

    那就考虑写到下一篇了,不过核心的功能就这些了~~

    对了,如果使用11以下的SDK ,请导入nineoldandroids动画库,用法基本完全一致~


    源码点击下载










    展开全文
  • ListViewAnimation

    2014-07-29 14:29:23
    ListViewAnimation效果实现 教程地址:http://blog.csdn.net/zhaokaiqiang1992
  • View Animation Only animate View objects If animate non-view objects, you have to implement your own code takes less time to setup and requires less code to write Drawable Animation Load drawable ...
  • Computer Animation

    2012-11-17 15:34:34
    Computer Animation Algorithms and Techniques
  • Animation & Property Animation 使用

    千次阅读 2015-03-11 16:39:35
    Android中开发动效有两套框架可以使用,分别为 Animation 和 Property Animation; 相对来说,Animator比Animation要强大太多,两者之间的主要区别在于: 区别一:需要的Anroid API level不一样 Property ...
  • animation动画库 + animation用法

    千次阅读 2018-09-10 05:43:24
    1. animation.css https://daneden.github.io/animate.css/ 简单使用时,f12 审查元素 .cls 就可以查找对应的animation。 这个库最简单。 2. hover.css  http://ianlunn.github.io/Hover/ f12审查元素,选中...
  • Animation Editor 1.3

    2015-02-05 10:50:18
    Animation Editor 1.3
  • If you are new to animation, this book will help you learn the core essence of animation based on the the 12 basic principles of animation You'll learn animation concepts and techniques to build a ...
  • Android Animation相关

    2015-11-10 12:12:02
    Android 补间动画 Animation 各个动画的例子 Animation使用到自定义View里
  • CSS animation

    万次阅读 2017-06-08 22:00:02
    CSS animation
  • Using the Animation view

    2017-09-01 11:34:57
    The Animation view is used to preview and edit Animation Clips for animated GameObjects in Unity. To open the Animation view in Unity, go to Window >Animation.
  • android 的动画也是比较常用的技术 主要是tween动画分为Animation和ActivityAnimation两种 适合初学者
  • Animation分解

    千次阅读 2016-05-18 14:00:34
    下面是一段分解animation的代码,具体的接口功能参见api static AnimationClip RebuildAniClip(AnimationClip aniClip, bool bUseScale) { AnimationClip newClip = null; EditorCurveBinding[] ...
  • Unity Animation动画操作

    2018-03-29 22:24:16
    Unity Animation动画操作以具体的例子详细的讲解了Animation动画的操作方法与使用
  • 比较全的android动画例子,包括基础的tween animation,这个就不必说了,还有比较新的属性动画:property animation
  • Animation动画实例

    2016-01-29 09:31:11
    Animation 动画实例,很有价值,值得参考。
  • 超详细 CSS动画-animation

    万次阅读 多人点赞 2021-03-17 13:37:41
    css3 animation @keyframes
  • Simulink 3D Animation

    2013-09-13 11:46:26
    Simulink 3D Animation
  • animation动画效果

    2011-11-14 14:00:40
    animation动画效果 animation动画效果 animation动画效果

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 250,830
精华内容 100,332
关键字:

animation