android 动画分享

作者: 墨染书 | 来源:发表于2017-10-29 23:28 被阅读0次

    动画分三种:View动画,帧动画,属性动画。

    View 动画

    概述:

    1. 一般只能修改组件(View Object)的部分属性,比如:scaling(大小)和rotation(旋转),但是无法修改组件的背景颜色,支持简单的缩放、平移、旋转、透明度基本的动画,且有一定的局限性,但是当View Animation能方便快速地解决需求时,选择它也是不错的选择。

    2. View Animation使某个组件产生动画效果移动一段距离后,比如从屏幕左侧移动到右侧,其实整个过程是绘制出来的效果,该组件真正的位置依然保留在左侧,只有点击左侧位置才能触发该组件。所以想真正移动某组件,需要在动画结束后添加代码实现。

    3. View动画的描述文件具有固定语法

    梳理一下View动画的知识点:

    1. 作用对象:View

    2. 共四种动画效果:平移动画,缩放动画,旋转动画,透明度动画

    3. 帧动画 属于 View动画,但是表现形式不同

    4. 建议采用XML定义,可读性更好(也可以代码动态创建)

    5. View动画的四种变换:

    名称 标签 子类 效果
    平移动画 <translate/> TranslateAnimation 移动View
    缩放动画 <scale/> ScaleAnimation 放大或缩小View
    旋转动画 <rotate/> RotateAnimation 旋转View
    透明度动画 <alpha/> AlphaAnimation 改变View的透明度

    使用案例(为方便就直接添加备注了):

    <!--float表示填入float值-->
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="[package:]anim/interpolator_resource"   
        android:shareInterpolator="false"      
        android:duration="float"        <!--动画持续时间-->
        android:fillAfter="true">          <!--动画结束后View是否停留在结束位置,true -> 挺留-->
        <alpha                                      
            android:fromAlpha="float"     <!--透明度的起始值,例如0.1--> 
            android:toAlpha="float"/>     <!--透明度的结束值,比如1-->
        <scale
            android:fromXScale="float"     <!--水平方向缩放的起始值,例如0.1-->
            android:toXScale="float"        <!--水平方向缩放的结束值,例如0.5-->
            android:fromYScale="float"     <!--竖直方向缩放的起始值-->
            android:toYScale="float"         <!--竖直方向缩放的结束值-->
            android:pivotX="float"        <!--缩放的轴点的x坐标,默认为View的中心-->
            android:pivotY="float"/>     <!--缩放的轴点的y坐标-->
        <translate     
            android:fromXDelta="float"     <!--x起始值,例如0-->
            android:toXDelta="float"       <!--x的结束值,例如10-->
            android:fromYDelta="float"      <!--y的起始值-->
            android:toYDelta="float"/>     <!--y的结束值-->
        <rotate
            android:fromDegrees="float"    <!--旋转开始的角度,例如0-->
            android:toDegrees="float"      <!--旋转结束的角度,例如180-->
            android:pivotY="float"         <!--旋转轴点的x坐标-->
            android:pivotX="float"/>     <!--旋转轴点的y坐标-->
    </set>   
    

    android:interpolator:
    插值器,影响动画的速度,默认为:@android:anim/accelerate_decelerate_interpolater(加速减速插值器)

    android:shareInterpolator:
    表示集合中的动画是否和集合共享同一个插值器。不指定插值器,则子动画就需要单独指定所需的插值器或使用默认值

    加入动画及监听

    启动动画:

    Animation anim = AnimationUtils.loadAnimation(this, R.anim.my_animation);
    button.startAnimation(animation);
    

    监听:
    能进行动画启动,结束,重复的监听

        anim.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
        //这里就是动画结束
            }
        });
    
    自定义动画

    上面是系统提供的四种动画,当然我们也可以自定义一些动画,它只需要继承Animation这个抽象类,重写initialize和applyTransformation方法。applyTransformation方法里面进行相应的矩阵变换。实际情况里面,很少使用这个,就不予讲解。

    帧动画(View动画的特殊形式)

    帧动画是顺序播放一组先定义好的图片,系统提供AnimationDrawable类完成工作。

    下面来介绍一些基本用法:

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
          android:oneshot="false">
        <item android:drawable="@drawable/gpf" android:duration="50"/>
        <item android:drawable="@drawable/gpg" android:duration="50"/>
        <item android:drawable="@drawable/gph" android:duration="50"/>
    </animation-list>
    

    添加动画:

    View loadingView = (View) findViewById(R.id.loading);
    loadingView.setBackgroundResource(R.drawable.drawable_anim);
    AnimationDrawable drawable = (AnimationDrawable) loadingView.getBackground();
    drawable.start();
    

    这里有一个坑,就是这个动画只能只能在drawable下新建文件添加动画,图片只能引用drawable里面的,它的英文名字就叫Drawable Animation嘛。从调用里面你应该也猜到原理了吧,其实就是一帧一帧的更换背景。但是帧动画容易引起 OOM,所以应尽量避免使用过多尺寸较大的图片。笔者在写的时候做了一个加载中的demo,很easy,试试吧。

    View 动画的经典使用姿势

    LayoutAnimation 改变你的ViewGroup

    LayoutAnimation(布局动画)是为ViewGroup指定一个动画。它可以为子View添加出场动画。最常见的就是ListView的item进场动画就是这个类完成的。

    初学姿势:

    <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
        android:delay="0.5"     
        android:animationOrder="normal"       
        android:animation="@anim/viewadd">       <!-- 指定具体的入场动画-->
    </layoutAnimation>
    

    添加动画:

    1. 在布局xml里面

       <ListView
           ...
           android:layoutAnimation=“@anim/lsit_layout_anim”  />
      
    2. 代码添加

    android:delay:动画延迟。

    android:animationOrder:子动画的顺序。共normal,reverse,random三种。
    normal -> 顺序显示,及排在前面的先显示。
    reverse -> 逆向显示
    random -> 随机显示

    转场动画(Activity跳转)

    为Activity和Fragment添加动画的方式很多,但是大多都有兼容问题,这是学习时的一个坑,可以注意一下。例如Fragment和属性动画都是API11的时候引入的,而这时候我们需要使用v4这个兼容包,那切换动画就只能使用FragmentTransaction 里面的setCustomAnimation() 来切换,但是这个方法只能使用View动画。

    每个Activity都有默认的跳转动画,而这个动画当然我们也可以自定义。主要就是使用 overridePeddlingTransition(int enterAnim, int extAnim)方法,当然,这个方法是在startActivity(Intent)和finish()方法之后被调用

    overridePeddlingTransition(int enterAnim, int extAnim):参数就是两个动画的资源id

    启动姿势:

    startActivity(new Intent(this, SecondActivity.class));
    overridePeddlingTransition(R.anim.enter_anim, R.anim.ext_anim);
    

    结束姿势:

    @Override
    public void finish(){
        super.finish();
        overridePeddlingTransition(R.anim.enter_anim, R.anim.ext_anim);
    }
    

    别人家的动画:

    属性动画

    属性动画讲解第一部分见 Android属性动画(Property Animation)

    插值器和估值器

    TimeInterpolator,时间插值器,作用就是根据时间流逝的百分比来计算出当前属性值改变的百分比。(得到百分比)
    LinearInterpolator,线性插值器:匀速动画
    AccelerateDecelerateInterpolator,加速减速插值器:两头慢中间快
    DecelerateInterpolator,减速插值器:动画越来越慢

    TypeEvaluator,类型估值器,根据当前属性改变的百分比来计算改变后的属性值(得到具体属性值)
    InteEvaluator,针对整形属性
    FloateEvaluator,针对浮点属性
    ArgbeEvaluator,针对Color属性

    属性动画监听

    1. AnimatorListener 上文使用过就不再赘述

    2. AnimatorListenerAdapter 类,他是AnimatorListener 的适配器类,所以就可以有选择的实现AnimatorListener 的方法

    3. AnimatorUpdateListener 接口,每播放一帧就被调用一次

      public static interface AnimatorUpdateListener {
           void onAnimationUpdate(ValueAnimator animation);
      }
      

    属性动画的工作原理:

    相关文章

      网友评论

        本文标题:android 动画分享

        本文链接:https://www.haomeiwen.com/subject/nihcpxtx.html