zoukankan      html  css  js  c++  java
  • 【Android

      补间动画也叫View动画,它只能针对View进行动画操作,且补间动画操作的只是View中可见的部分,即只操作界面,对于可点击区域等都不会进行操作。

      在Android中,补间动画的顶级类是Animation。补间动画包括对View的透明度、缩放、平移、旋转进行动画操作,对应的JAVA类分别是AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation。

      Android还提供了一个动画集合AnimationSet,可以将多个动画单体放入集合中共同进行,集合中的多个动画可以选择共享一套动画差值器和执行时间。

      本文将从两个角度介绍补间动画,第一是从补间动画的基本使用介绍,第二是介绍补间动画在实际开发中的其他应用,包括用于指定ViewGroup中View的动画的LayoutAnimation、用于控制Activity切换效果的动画等。

    基本使用介绍

      补间动画可以写在XML文件中,也可以写在JAVA文件中,但官方推荐写在XML文件中,因为XML格式更加易于阅读。

      在补间动画的XML表示法中,我们可以使用<alpha>、<scale>、<translate>、<rotate>分别表示四种动画,也可以使用<set>标签表示一个动画集合。下面是一个包括所有属性的补间动画XML文件描述的示例,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fillAfter="true"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:shareInterpolator="true">
    
        <alpha
            android:fromAlpha="0%"
            android:toAlpha="100%" />
    
        <scale
            android:fromXScale="100%"
            android:fromYScale="100%"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="200%"
            android:toYScale="200%" />
    
        <translate
            android:fromXDelta="0%"
            android:fromYDelta="0%"
            android:toXDelta="100%"
            android:toYDelta="100%" />
    
        <rotate
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" />
    
    </set>

      上述代码中各个属性的详细解释如下:

    android:interpolator:差值器,用来控制动画的速度
        BounceInterpolator:弹跳效果;
        AccelerateInterpolator:逐渐加速;
        DecelerateInterpolator:逐渐减速;
        AccelerateDecelerateInterpolator:先加速后减速;
        OvershootInterpolator:到达目标点时“跑过头了”,再返回到目标点;
        AnticipateInterpolator:移动之前先向后“助跑”;
        AnticipateOvershootInterpolator:OvershootInterpolator和AnticipateInterpolator的组合效果;
        CycleInterpolator:对于指定的动画,正向做一遍,反响做一遍
    android:shareInterpolator:<set>标签中的动画是否共享差值器
    android:duration:动画集合播放时间
    android:fillAfter:动画结束后是否停留在最后的状态
    <alpha>:透明度动画
        android:fromAlpha:动画开始时候的透明度
        android:toAlpha:动画结束时候的透明度
    <scale>:缩放动画
        android:fromXScale:动画开始时候X轴的缩放倍数
        android:fromYScale:动画开始时候Y轴的缩放倍数
        android:pivotX:缩放中心点X坐标
        android:pivotY:缩放中心点Y坐标
        android:toXScale:动画结束时候X轴的缩放倍数
        android:toYScale:动画结束时候Y轴的缩放倍数
    <translate>:平移动画
        android:fromXDelta:动画开始时候X轴的坐标位置
        android:fromYDelta:动画开始时候Y轴的坐标位置
        android:toXDelta:动画结束时候X轴的坐标位置
        android:toYDelta:动画结束时候Y轴的坐标位置
    <rotate>:旋转动画
        android:fromDegrees:动画开始时候的角度
        android:toDegrees:动画结束时候的角度
        android:pivotX:旋转中心点的X坐标
        android:pivotY:旋转中心点的Y坐标

      除了使用XML格式编写动画代码,还可以在JAVA代码中编写动画代码,此时就需要用到AnimationSet、AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation这几个类了。下面是一个使用JAVA代码编写动画的代码:

    AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
    ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, 0.5f, 0.5f);
    TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 500.0f, 0.0f, 500.0f);
    RotateAnimation rotateAnimation = new RotateAnimation(0.0f, 360.0f, 0.5f, 0.5f);
    
    AnimationSet set = new AnimationSet(true);
    set.setDuration(1000);
    set.addAnimation(alphaAnimation);
    set.addAnimation(scaleAnimation);
    set.addAnimation(translateAnimation);
    set.addAnimation(rotateAnimation);
    set.start();

    其他使用方法

      上一章节中介绍了补间动画Animation的基本使用,这个章节将介绍补间动画的一些其他的使用方法。

    LayoutAnimation

      LayoutAnimation用于统一地控制ViewGroup中每个View的动画效果,还可以控制每个View动画之间的间隔,达到依次入场的效果。例如,在下面的例子中,我们将控制一个ListView中所有Item的入场动画,达到所有Item依次入场的效果。

      ListView中有一个属性: android:layoutAnimation ,这个属性用于控制ListView作为一个ViewGroup,其内所有Item的动画。layout文件中ListView的布局代码如下:

    <ListView
        android:id="@+id/animate_main_lv_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@android:color/transparent"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="1.0dip"
        android:layoutAnimation="@anim/anim_layout_listview"
        android:scrollbars="none" />

      我们需要新建一个动画文件anim_layout_listview.xml,在这个文件中编写LayoutAnimation,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
        android:animation="@anim/anim_item_listview"
        android:animationOrder="normal"
        android:delay="50%"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator" />

      上述代码中各个属性的详细解释如下:

    android:animation:每个Item都执行的动画
    android:animationOrder:各Item的动画执行顺序,分为normal顺序、reverse逆序、random随机
    android:delay:各Item之间的动画间隔,百分比,表示Item动画时长的百分比
    android:interpolator:动画差值器

      我们还需要创建另一个动画文件anim_item_listview.xml,用于表示每个Item的动画,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:fillAfter="true"
        android:shareInterpolator="true">
    
        <alpha
            android:fromAlpha="0.1"
            android:toAlpha="1.0" />
    
        <translate
            android:fromXDelta="500"
            android:toXDelta="0" />
    
    </set>

      每个Item都从透明都不透明,从右侧平移到左侧,且上下两个Item之间的动画间隔250ms(500ms * 50%)。

    Activity切换动画

      Activity的切换动画一般需要四个动画,分别表示新Activity进入时候的动画、旧Activity退出时候的动画、新Activity退出时候的动画、旧Activity进入时候的动画,因此,本例中分别使用anim_activity_new_in.xml、anim_activity_new_out.xml、anim_activity_old_in.xml、anim_activity_old_out.xml四个动画文件表示。

      Activity的切换动画也有两种方式来控制,分别是通过JAVA代码控制和通过XML代码来配置。

      首先介绍使用JAVA代码控制的方式,先来看代码:

    Intent intent = new Intent(context, NextActivity.class);
    startActivity(intent);
    overridePendingTransition(R.anim.anim_activity_new_in, R.anim.anim_activity_old_out);

      可以看到,直接使用 overridePendingTransition() 方法来控制即可,在方法中设置两个参数,分别是新Activity进入和旧Activity退出的动画资源ID,通过这一行代码,就可以简单地实现Activity之间的切换动画。需要注意的是,这个方法必须在startActivity()方法或finish()方法之后调用,否则无效。

      上面这种方法只能控制单个Activity的切换动画,不能控制全局所有Activity的切换动画。如果想要控制项目中所有Activity的切换动画,就需要用到第二种方式:XML配置方式。

      在XML配置方式中,我们既可以控制所有Activity的切换动画,也可以控制单个Activity的切换动画,只需要选择在<application>总标签中或某个特定的<activity>标签中配置 android:theme 属性即可。android:theme属性指定了一个XML文件,下面贴出一个示例中的XML代码:

    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowAnimationStyle">@style/activityAnimation</item>
    </style>
    
    <style name="activityAnimation" parent="@android:style/Animation">
        <item name="android:activityCloseEnterAnimation">@anim/anim_activity_old_in</item>
        <item name="android:activityCloseExitAnimation">@anim/anim_activity_old_out</item>
        <item name="android:activityOpenEnterAnimation">@anim/anim_activity_new_in</item>
        <item name="android:activityOpenExitAnimation">@anim/anim_activity_new_out</item>
    </style>

      可以看到,在AppTheme中设置了 android:windowAnimationStyle 属性指定Activity切换的四种动画,然后在下面引用了这四种动画。这样就配置好了项目中所有Activity的切换动画。

  • 相关阅读:
    FreeMark教程
    Intellij IDEA 创建Web项目并在Tomcat中部署运行
    catalina.home和catalina.base这两个属性的作用
    如何用javac 和java 编译运行整个Java工程
    Java中Properties类的操作
    注册邮箱验证激活技术
    commons-logging的使用
    Windows下安装GDB
    BM算法
    Intellij IDEA 部署 项目在tomcat 原理
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6978139.html
Copyright © 2011-2022 走看看