android我爱编程

Android动画

2016-08-03  本文已影响634人  四月一号

Animation


scale
alpha
rotate
translate
set
执行动画(XML)
Interpolator插值器
代码生成动画

前面介绍了通过xml定义动画,动画集合,插值器等,其实通过代码也可以做到.

Property Animator(属性动画)


ValueAnimator
ObjectAnimator

<animator /> 对应ValueAnimator
<objectAnimator /> 对应ObjectAnimator
<set /> 对应AnimatorSet

布局动画

LayoutAnimation
  1. XML实现
    <?xml version="1.0" encoding="utf-8"?>
    <layoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="1"
    android:animationOrder="normal"
    android:animation="@anim/slide_in_left"/>

    ...
    
    <ListView android:id="@+id/listview" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" 
            android:layoutAnimation="@anim/layout_animation" />
    
  2. 代码实现
    //得到一个LayoutAnimationController对象;
    LayoutAnimationController controller = new LayoutAnimationController(animation);
    //设置控件显示的顺序;
    controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
    //设置控件显示间隔时间;
    controller.setDelay(0.3f);
    //为ListView设置LayoutAnimationController属性;
    mListView.setLayoutAnimation(controller);
    mListView.startLayoutAnimation();

  3. 各字段解释
    delay:指每个Item的动画开始延时,取值是android:animation所指定动画时长的倍数,取值类型可以是float类型,也可以是百分数,默认是0.5;比如我们这里指定的动画是@anim/slide_in_left,而在slide_in_left.xml中指定android:duration=”1000”,即单次动画的时长是1000毫秒,而我们在这里的指定android:delay=”1”,即一个Item的动画会在上一个item动画完成后延时单次动画时长的一倍时间开始,即延时1000毫秒后开始。
    animationOrder:指viewGroup中的控件动画开始顺序,取值有normal(正序)、reverse(倒序)、random(随机)
    animation:指定每个item入场所要应用的动画。仅能指定res/aim文件夹下的animation定义的动画,不可使用animator动画。

GridLayoutAnimation
  1. XML实现
    <?xml version="1.0" encoding="utf-8"?>
    <gridLayoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:rowDelay="75%"
    android:columnDelay="60%"
    android:directionPriority="none"
    android:direction="bottom_to_top|right_to_left"
    android:animation="@android:anim/slide_in_left"/>

    ***
    
    <GridView android:id="@+id/grid" 
          android:layout_width="match_parent" 
          android:layout_height="match_parent" 
          android:columnWidth="60dp" 
          android:gravity="center" 
          android:horizontalSpacing="10dp"           
          android:layoutAnimation="@anim/gride_animation"  
          android:numColumns="auto_fit" 
          android:stretchMode="columnWidth" 
          android:verticalSpacing="10dp"/>
    
  2. 代码实现
    GridLayoutAnimationController controller = new GridLayoutAnimationController(animation);
    controller.setColumnDelay(0.75f);
    controller.setRowDelay(0.5f);
    controller.setDirection(GridLayoutAnimationController.DIRECTION_BOTTOM_TO_TOP|GridLayoutAnimationController.DIRECTION_LEFT_TO_RIGHT);
    controller.setDirectionPriority(GridLayoutAnimationController.PRIORITY_NONE);
    grid.setLayoutAnimation(controller);
    grid.startLayoutAnimation();

  3. 各属性解释
    rowDelay:每一行动画开始的延迟。与LayoutAnimation一样,可以取百分数,也可以取浮点数。取值意义为,当前android:animation所指动画时长的倍数。 columnDelay:每一列动画开始的延迟。取值类型及意义与rowDelay相同。 directionPriority:方向优先级。取值为row,collumn,none,意义分别为:行优先,列优先,和无优先级(同时进行);
    direction:gridview动画方向。 取值有四个:
    *left_to_right:列,从左向右开始动画
    right_to_left :列,从右向左开始动画
    top_to_bottom:行,从上向下开始动画
    bottom_to_top:行,从下向上开始动画 *
    这四个值之间可以通过“|”连接,从而可以取多个值。
    很显然left_to_right和right_to_left是互斥的,
    top_to_bottom和bottom_to_top是互斥的。
    如果不指定 direction字段,
    默认值为left_to_right | top_to_bottom;
    即从上往下,从左往右。
    animation: gridview内部元素所使用的动画。

布局增加/移除动画
  1. android:animateLayoutChanges="true"
    只要给布局添加该属性,它内部的控件在添加和删除时,是会带有默认动画
  2. LayoutTransaction ,允许我们自定义动画效果
    LayoutTransaction transitioner = new LayoutTransition();
    ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotation", 0f, 90f, 0f);
    //设置动画
    //第一个参数int transitionType:表示当前应用动画的对象范围,取值有:
    //APPEARING —— 添加元素的动画
    //DISAPPEARING —— 移除元素的动画
    //CHANGE_APPEARING —— 添加元素时,其它元素的动画(该动画必须通过PropertyValuesHolder创建)
    //CHANGE_DISAPPEARING —— 移除元素时,其它元素的动画(该动画必须通过PropertyValuesHolder创建)
    //第二个参数Animator animator:表示当前所选范围的控件所使用的动画。
    transitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
    //将LayoutTransaction设置进ViewGroup
    linearLayout.setLayoutTransition(mTransitioner);
    因为LayoutTransaction 使用的机会不多,且实际应用相对麻烦,所以不再详细说明
上一篇下一篇

猜你喜欢

热点阅读