android 动画分享

动画分三种: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);
    }
    

属性动画的工作原理:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,884评论 25 707
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,939评论 0 24
  • "I realize I cannot be perfect, but I want to be rea...
    焖章阅读 149评论 0 0
  • 南眺吕梁山,北依人工岭;下坐万丈楼,上对无边天;表观才飞扬,心中无东西。屋高忙楼事,孑身入泰顶;烦事皆无愿,何处是秋香。
    0南子0阅读 247评论 0 2
  • 愿你的人生没有颠沛流离,只有一帆风顺。
    丁玲wisteria阅读 165评论 0 0