Android Animation动画详解(一): 补间动画

简介:

前言

你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢?

啥?你没有思考,更没有研究过?

好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效吧,come on!


一、Android的动画类型

Tween Animation 补间动画

Frame Animation 帧动画

Layout Animation 布局动画

Property Animation 属性动画


总体来讲,Android中的动画就这四种,而我们常常在APP中看到的动画多多少少都是由这四个基础动画实现的。这几种动画效果中,除了Property实现较为复杂外,其余的三种动画的实现都比较简单。而Android神奇的地方就在于,通过这些简单的动画,我们可以完成较为绚丽的效果。


二、Tween动画类介绍

Android的Tween动画由四种类型组成:alpha、scale、translate、rotate。这四种动画实现起来较为容易,让我们一起来看下如何实现:


2.1 XML配置文件中

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

rotate 画面转移旋转动画效果


2.2 Java Code代码中

AlphaAnimation 渐变透明度动画效果

ScaleAnimation 渐变尺寸伸缩动画效果

TranslateAnimation 画面转换位置移动动画效果

RotateAnimation 画面转移旋转动画效果


2.3 XML文件中定义动画

首先,我们需要在项目的res目录中新建anim文件夹,然后在anim中创建我们的动画资源:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <alpha/>
  <scale/>
  <translate/>
  <rotate/>
</set>


2.4 加载并播放动画

public static Animation loadAnimation (Context context, int id) 
//第一个参数Context为程序的上下文    
//第二个参数id为动画XML文件的引用
//例子:
myAnimation= AnimationUtils.loadAnimation(this, R.anim.my_action);
//使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件

从方法代码很容易理解,首先利用AnimationUtil去加载动画,之后调用View的startAnimation方法,即可为该View播放动画。


三、 Tween动画XML实现、解析

3.1 Alpha Animation

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true"
    android:interpolator="@android:anim/accelerate_interpolator">

    <!-- 透明度控制动画效果 alpha
         浮点型值:
             fromAlpha 属性为动画起始时透明度
             toAlpha   属性为动画结束时透明度
             说明:
                 0.0表示完全透明
                 1.0表示完全不透明
             以上值取0.0-1.0之间的float数据类型的数字

         长整型值:
             duration  属性为动画持续时间
             说明:
                 时间以毫秒为单位
 -->

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        android:duration="3000"
        />
</set>

3.2 Scale Animation

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true"
    android:interpolator="@android:anim/accelerate_interpolator">
    <!-- 尺寸伸缩动画效果 scale
           属性:interpolator 指定一个动画的插入器
            在我试验过程中,使用android.res.anim中的资源时候发现
            有三种动画插入器:
                accelerate_decelerate_interpolator  加速-减速 动画插入器
                accelerate_interpolator         加速-动画插入器
                decelerate_interpolator         减速- 动画插入器
            其他的属于特定的动画效果
          浮点型值:

                fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
                toXScale   属性为动画结束时 X坐标上的伸缩尺寸

                fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
                toYScale   属性为动画结束时Y坐标上的伸缩尺寸

                说明:
                     以上四种属性值

                        0.0表示收缩到没有
                        1.0表示正常无伸缩
                        值小于1.0表示收缩
                        值大于1.0表示放大

                pivotX     属性为动画相对于物件的X坐标的开始位置
                pivotY     属性为动画相对于物件的Y坐标的开始位置

                说明:
                        以上两个属性值 从0%-100%中取值
                        50%为物件的X或Y方向坐标上的中点位置

            长整型值:
                duration  属性为动画持续时间
                说明:   时间以毫秒为单位

            布尔型值:
                fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
    -->

   <!-- <scale
        android:duration="3000"
        android:fromXScale="0.2"
        android:fromYScale="0.2"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />-->

    <scale
        android:duration="3000"
        android:fromXScale="0.2"
        android:fromYScale="0.2"
        android:pivotX="0%"
        android:pivotY="0%"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>


3.3 Translate Animation
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true"
    android:interpolator="@android:anim/accelerate_interpolator">

    <!-- translate 位置转移动画效果
        整型值:
            fromXDelta 属性为动画起始时 X坐标上的位置
            toXDelta   属性为动画结束时 X坐标上的位置
            fromYDelta 属性为动画起始时 Y坐标上的位置
            toYDelta   属性为动画结束时 Y坐标上的位置
            注意:
                     没有指定fromXType toXType fromYType toYType 时候,
                     默认是以自己为相对参照物
        长整型值:
            duration  属性为动画持续时间
            说明:   时间以毫秒为单位
-->

    <translate
        android:duration="1000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100"
        android:toYDelta="100" />

    <!-- <translate
         android:duration="1000"
         android:fromXDelta="0%p"
         android:fromYDelta="0%p"
         android:toXDelta="90%p"
         android:toYDelta="110%p"
         />-->

</set>


3.4 RotateAnimation

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true"
    android:interpolator="@android:anim/accelerate_interpolator">

    <!-- rotate 旋转动画效果
       属性:interpolator 指定一个动画的插入器
             在我试验过程中,使用android.res.anim中的资源时候发现
             有三种动画插入器:
                accelerate_decelerate_interpolator    加速-减速 动画插入器
                accelerate_interpolator                加速-动画插入器
                decelerate_interpolator                减速- 动画插入器
             其他的属于特定的动画效果

       浮点数型值:
            fromDegrees 属性为动画起始时物件的角度
            toDegrees   属性为动画结束时物件旋转的角度 可以大于360度


            说明:
                     当角度为负数——表示逆时针旋转
                     当角度为正数——表示顺时针旋转
                     (负数from——to正数:顺时针旋转)
                     (负数from——to负数:逆时针旋转)
                     (正数from——to正数:顺时针旋转)
                     (正数from——to负数:逆时针旋转)

            pivotX     属性为动画相对于物件的X坐标的开始位置
            pivotY     属性为动画相对于物件的Y坐标的开始位置

            说明:        以上两个属性值 从0%-100%中取值
                         50%为物件的X或Y方向坐标上的中点位置

        长整型值:
            duration  属性为动画持续时间
            说明:       时间以毫秒为单位
-->

    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="120" />
</set>


上述代码示例中,我们教大家如何去定义四种基本的补间动画,定义动画结束后,我们来看看播放动画吧:

@OnClick({R.id.btn_translate, R.id.btn_rotate, R.id.btn_alpha, R.id.btn_scale})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_translate:
                Animation translate = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_animation);
                imgView.startAnimation(translate);
                break;

            case R.id.btn_rotate:
                Animation rorate = AnimationUtils.loadAnimation(getActivity(), R.anim.rorate_animation);
                imgView.startAnimation(rorate);
                break;

            case R.id.btn_alpha:
                Animation alpha = AnimationUtils.loadAnimation(getActivity(), R.anim.alpha_animation);
                imgView.startAnimation(alpha);
                break;

            case R.id.btn_scale:
                Animation scale = AnimationUtils.loadAnimation(getActivity(), R.anim.scale_animation);
                imgView.startAnimation(scale);
                break;
        }
    }

看到了么,播放动画其实很简单的,就两个步骤:1. 加载动画; 2 播放动画。


四、 Tween动画Java代码实现、解析

在上文介绍Tween动画时,我们说过有两种实现方式,一个是在XML文件中,一个是在Java代码中。 之前我们已经介绍了如何在XML文件中配置动画(这也是我们推荐使用的方式)下面我们看看如何在Java代码中实现吧。


//在代码中定义 动画实例对象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;

//根据各自的构造方法来初始化一个实例对象
myAnimation_Alpha = new AlphaAnimation(0.1f, 1.0f);
myAnimation_Scale = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Translate = new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
myAnimation_Rotate = new RotateAnimation(0.0f, +350.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

just as this,通过构造方法,动画已经定义好了,让我们仔细看下每种动画效果的参数是啥意思:


1. AlphaAnimation


AlphaAnimation类对象构造: public AlphaAnimation(float fromAlpha, float toAlpha)

 

第一个参数fromAlpha为 动画开始时候透明度,第二个参数toAlpha为 动画结束时候透明度。

说明:0.0表示完全透明,1.0表示完全不透明


Animatio myAnimation_Alpha = new AlphaAnimation(0.1f, 1.0f);
//设置动画持续时间
myAnimation_Alpha.setDuration(5000);//设置时间持续时间为 5000毫秒

2. ScaleAnimation


ScaleAnimation类对象构造:public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 


//第一个参数fromX为动画起始时 X坐标上的伸缩尺寸    
//第二个参数toX为动画结束时 X坐标上的伸缩尺寸     
//第三个参数fromY为动画起始时Y坐标上的伸缩尺寸    
//第四个参数toY为动画结束时Y坐标上的伸缩尺寸  
/*说明:
     以上四种属性值    
     0.0表示收缩到没有 
     1.0表示正常无伸缩     
     值小于1.0表示收缩  
     值大于1.0表示放大
*/
//第五个参数pivotXType为动画在X轴相对于物件位置类型  
//第六个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第七个参数pivotXType为动画在Y轴相对于物件位置类型   

//第八个参数pivotYValue为动画相对于物件的Y坐标的开始位置


Animation myAnimation_Scale = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Scale.setDuration(700);//设置时间持续时间为 700毫秒

3. TranslateAnimation

TranslateAnimation类对象构造:public TranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta) 


//第一个参数fromXDelta为动画起始时 X坐标上的移动位置    
//第二个参数toXDelta为动画结束时 X坐标上的移动位置      
//第三个参数fromYDelta为动画起始时Y坐标上的移动位置     

//第四个参数toYDelta为动画结束时Y坐标上的移动位置


Animation myAnimation_Translate = new TranslateAnimation(10f, 100f, 10f, 100f);
myAnimation_Translate.setDuration(2000);//设置时间持续时间为 2000毫秒

4. RotateAnimation


RotateAnimation类对象构造:public RotateAnimation(float fromDegrees, float toDegrees,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)


//第一个参数fromDegrees为动画起始时的旋转角度    
//第二个参数toDegrees为动画旋转到的角度   
//第三个参数pivotXType为动画在X轴相对于物件位置类型  
//第四个参数pivotXValue为动画相对于物件的X坐标的开始位置
//第五个参数pivotXType为动画在Y轴相对于物件位置类型   

//第六个参数pivotYValue为动画相对于物件的Y坐标的开始位置


Animation myAnimation_Rotate = new RotateAnimation(0.0f,+350.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Rotate.setDuration(3000);//设置时间持续时间为 3000毫秒

大家可以看出,通过Java代码,其实也是可以实现这些动画效果,只是我们推荐将动画资源和java代码分开,即使用xml动画资源。


五、结尾

相信看到这里,大家应该都知道如何去定义补间动画了,如果你还不知道,那好,请再看一遍,哈哈哈哈。。。。

基础的补间动画其实就是这么easy,但是大家知道,真的开发过程中,尤其是较为绚烂的效果,肯定不可能只是使用单一的效果,不过不用担心,复杂的动画无非是这些基础的动画结合在一起使用而已,就像复杂的项目都是由基础的代码实现一样。 下一章,将会带领大家一起学习下,稍微复杂的动画效果,duang的一下,特效来啦。


源代码下载地址(免费): http://download.csdn.net/detail/zuiwuyuan/9038761

相关文章
|
4月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
191 30
|
4月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
365 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
4月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
121 3
|
4月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
254 65
|
4月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
107 26
|
4月前
|
XML Android开发 数据格式
Android中SlidingDrawer利用透明动画提示效果
本文介绍了在Android中使用`SlidingDrawer`实现带有透明动画提示效果的方法。通过XML布局配置`SlidingDrawer`的把手(handle)和内容(content),结合Activity中的代码实现动态动画效果。最终实现了交互性强、视觉效果良好的滑动抽屉功能。
Android中SlidingDrawer利用透明动画提示效果
|
4月前
|
XML Java Android开发
Android 动画之帧动画 + 补间动画 + 属性动画
本文介绍了Android开发中的三种动画类型:帧动画、补间动画和属性动画。帧动画通过依次播放一系列静态图片实现动态效果,支持Java代码与XML两种实现方式。补间动画基于起始和结束位置自动生成过渡效果,涵盖透明度、位移、旋转、缩放及组合动画等多种形式,并可搭配插值器优化动画过程。属性动画则通过改变对象属性实现动画,支持透明度、位移、旋转、缩放及组合动画,灵活性更高且适用于更复杂的场景。文中提供了详细的代码示例,帮助开发者快速上手。
248 15
|
4月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
Android自定义view之围棋动画(化繁为简)
|
4月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。
|
4月前
|
XML Java API
Android翻转动画(卡片翻转效果)
本文介绍了如何实现卡片翻转动画效果,通过Android中的ObjectAnimator结合不同插值器(LinearInterpolator、AccelerateInterpolator、DecelerateInterpolator)完成平滑过渡。示例中以按钮点击触发动画,核心逻辑包括判断视图可见性、设置旋转角度及处理初始Bug(如第一次点击异常)。最终提供完整代码(Java与XML布局),并指出将按钮事件替换为屏幕监听即可满足右滑触发需求。适合初学者学习动画实现原理。
140 0