深入理解动画

深入理解动画

android动画分为view动画,帧动画,属性动画三种

View动画


  • 种类:平移动画(TranslateAnimation),缩放动画(ScaleAnimation),旋转动画(RotateAnimation),透明度动画(AlphaAnimation)

  • 创建方式:1.创建xml文件(在res/anim/下创建)

      	   2.代码动态创建
    

对于view动画建议使用xml创建,可读性好

名称标签子类效果
平移动画TanslateAnimation移动view
缩放动画ScaleAnimation放大或缩小view
旋转动画RotateAnimation旋转view
透明度动画AlphaAnimation改变view的透明度

例如:

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:repeatMode="restart"
    >
    <scale android:fromXScale="1"
           android:toXScale="1.5"
           android:fromYScale="1"
           android:toYScale="1.5"
           android:pivotY=""----------缩放的轴点的y坐标,默认为view的中心
           android:pivotX=""
        />
    <rotate android:fromDegrees="0"
        android:toDegrees="180"
            android:pivotX=""
            android:pivotY=""
        />
</set>

在代码里使用xml创建的动画:

Animation translateAnimation=AnimationUtils.loadAnimation(this,R.anim.anim_translate);
mBtnLogin.startAnimation(translateAnimation);

标签表示动画集合,它可以是某个单一的动画,也可以是一系列的动画

它的两个属性:

  • android:interpolater

    表示动画集合使用的差值器,它影响动画的执行速度。默认为加速减速差值器

  • android:shareInterpolater

    表示集合中的动画是否和集合共享一个差值器。

    还可以监听animation的动画过程,具体api为AnimationListener

view动画的特殊使用场景

1.在viewGroup中控制子元素的出场效果

使用LayoutAnimationQQ截图20190611160839

在xml文件中给viewGroup指定layoutAnimation属性,这样viewGroup中的child就具有出场动画了。这种方式适用所有的viewGroup.

2.不同activity的切换效果

activity有默认的切换效果,也可以自定义切换效果,主要用到overridePendingTransition方法,该方法必须在startActivity()或finish()之后调用才生效。

帧动画

顺序播放一系列的图片类似播放电影。不同于view动画,帧动画通过AnimationDrawable来播放。

使用:创建xml文件定义一个AnimationDrawable,将该drawable作为view的背景,通过drawablew来播放动画。

注意:在定义Animation时不要使用过多尺寸较大的图片以免引起OOM。

属性动画

API 11新加入的特性,和view动画不同,属性动画可以对任意对象的属性进行动画,不仅仅是view,动画默认时间间隔是300ms.在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。有ValueAnimator,ObjectAnimator,AnimatorSet等概念,通过它们可以实现各种绚丽的效果。

可以改变一个对象的translationY,backgroundColor等属性

//改变view的背景色
ValueAnimator colorAnimator=ObjectAnimator.ofInt(mBtnLogin,"backgroundColor",0xffff8080,0xff8080ff);
colorAnimator.setDuration(500);
colorAnimator.start();

也可以设置插值器。

也可以通过xml来定义,位于res/animator目录下。通过AnimatorInflater.loadAnimator.setTarget将定义的xml属性动画作用于一个对象上。

建议开发中使用代码实现属性动画。

属性动画还提供了监听动画过程的接口:AnimatorUpdateListener,AnimatorListener.监听动画的开始,结束,取消和重复播放的过程

属性动画原理

属性动画要求作用的对象提供set和get方法,根据外界传递的初始值和最终值以动画的效果多次调用set方法,随着时间的推移所传递的值越来越接近最终值。

总结:如果对一个对象的某个属性做动画要同时满足两个条件才可以生效

  1. object必须要提供set方法,如果动画的时候没有提供初始值,还要提供get方法,因为系统要去取属性的初始值

  2. object的set方法对属性做的操作必须能够通过某种方式展现出来(ui发生变化)

    有时会出现不能同时满足以上两种条件的情况,解决方案:

    • 给对象加上get,set方法,如果有权限的话(很多情况下是没有的)
    • 用一个类来包装原始对象,间接提供get,set方法(推荐)
    • 使用ValueAnimator,监听动画过程,自己实现属性的改变

动画使用注意事项:

  1. OOM问题。

    尽量避免使用过多过大的图片

  2. 内存泄漏。

    在属性动画中用无限循环播放的动画在activity退出时要及时停止,以免activity无法释放从而造成内存泄漏,view动画不存在该问题。

  3. 动画元素的交互。

    将view移动后,在3.0以前,不管是属性动画或是view动画在新位置都无法触发单击事件,3.0以后属性动画不存在该问题,但view动画依然在原位置。

  4. 硬件加速

    使用动画时为保证动画的流畅性建议开启硬件加速。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值