Android属性动画

写在前面

android属性动画可以作用在所有view上
android中的属性动画是会改变空间的真实位置,即属性动画执行了以后,相当于原来的view就没有了,原来的那个view就变成了执行完动画的那个view,坐标原点也变成了这个新的view的左上角坐标

代码方式定义属性动画

属性动画的定义方式相对来说简单了很多,用ObjectAnimator.ofFloat方法获取一个ObjectAnimator的对象,即可实现各种动画

公共的方法
//设置动画的持续时间
setDuration(2000);
 //设置动画播放完毕后是否保持在动画播放完毕的状态
setFillAfter(true);
/*
设置动画的重复次数,这里的重复次数指的是动画第一次播放完毕后还会重复播放几次,这里设置为3,就是动画一共播放四次,开始执行一次动画,然后再重复执行三次。
 */
setRepeatCount(3);
/*
设置动画重复的模式
有Animation.RESTART:在动画多次播放时每一次都和第一次一样,重复执行
 Animation.REVERSE:每一次执行动画是,和上一次执行相反的操作
例如动画是把view放大到原来的两倍,动画一共执行4次
如果是Animation.RESTART,就会每次都从view本身的大小变到2倍的大小,这一过程一共执行4次
如果是Animation.REVERSE,则第一回从本身大小到2倍,第二回从2倍到本身大小,第三回从2倍到view本身第四回再从view本身到2倍
*/
setRepeatMode(Animation.REVERSE);

1 透明动画

/*
                第一个参数:动画作用在哪个view上
                第二个参数:执行哪种动画,对于透明动画,只有alpha这一种值
                后面的参数是一个可变类型的参数,可以传入任意多个数值,数值范围是从0到1
                动画按照传入的数值的顺序执行,一次动画结束后停止在最后一个参数的位置。
                 */
                ObjectAnimator alphaAnimator=ObjectAnimator.ofFloat(imageView,"alpha",1.0f,0,1.0f);
                alphaAnimator.setDuration(2000);
                alphaAnimator.start();

2 缩放动画

 /*
                第一个参数:动画作用在哪个view上
                第二个参数:执行哪种动画,可以传入scaleX或者scaleY,在x方向或者y方向缩放
                后面的参数是一个可变类型的参数,可以传入任意多个数值,数值大小代表放大的倍数
                动画按照传入的数值的顺序执行,一次动画结束后停止在最后一个参数的位置。
                 */
              ObjectAnimator scaleAnimator =ObjectAnimator.ofFloat(imageView,"scaleX",1.0f,0.5f);
              scaleAnimator.setDuration(2000);
              scaleAnimator.start();

3 旋转动画

 /*
                第一个参数:动画作用在哪个view上
                第二个参数:执行哪种动画
                可以传入rotation:代表绕中心点旋转
                rotationX:绕穿过中心点的横轴立体的旋转
                rotationY:绕穿过中心点的纵轴立体的旋转
                后面的参数是一个可变类型的参数,可以传入任意多个数值,数值大小代表旋转的角度
                动画按照传入的数值的顺序执行,一次动画结束后停止在最后一个参数的位置。
                 */
                ObjectAnimator rotate=ObjectAnimator.ofFloat(imageView,"rotation",0,70,0);
                rotate.setDuration(2000);
                rotate.start();

4 位移动画

 /*
                第一个参数:动画作用在哪个view上
                第二个参数:执行哪种动画
                可以传入translationX:在x轴方向移动
                translationY:在y方向移动
                后面的参数是一个可变类型的参数,可以传入任意多个数值,数值代表移动到的坐标的位置
                动画按照传入的数值的顺序执行,一次动画结束后停止在最后一个参数的位置。
                 */
              ObjectAnimator translate=ObjectAnimator.ofFloat(imageView,"translationX",0,40.0f,0);
              translate.setDuration(2000);
              translate.start();

5 动画集合
5.1 定义动画的集合
注意是AnimatorSet 不是AnimationSet

 AnimatorSet set=new AnimatorSet();

5.2 定义集合内部的动画
这里定义了3个动画

ObjectAnimator alphaAnimator1=ObjectAnimator.ofFloat(imageView,"alpha",1.0f,0,1.0f);
ObjectAnimator rotate1=ObjectAnimator.ofFloat(imageView,"rotate",0,70f);
ObjectAnimator translate1=ObjectAnimator.ofFloat(imageView,"translateX",0,40f,0);

5.3 设置一些参数

set.setDuration(2000);

5.4 设置集合动画要作用的目标view

set.setTarget(imageView);

5.5 执行动画
可以选择以下两种方式中的一种

 //这个代表三个动画按照顺序执行
set.playSequentially(alphaAnimator1,rotate1,translate1);
//这个代表三个动画一起执行
set.playTogether(alphaAnimator1,rotate1,translate1);
用xml方式定义属性动画
公共的属性

不用多说,和上面完全一致,需要说一点,有时这些属性没有代码提示,直接手打出来就行。定义在set中代表可以应用于set中的所有动画,应用在单独的动画中代表只对该动画起作用

android:duration="2000"
android:repeatMode="restart"
android:repeatCount="3"
android:fillAfter="true"

用xml方式定义属性动画,首先需要在res下建立animator目录,在目录下建立动画文件,在文件中写xml代码。
属性动画定义单独的动画时格式基本相同
1 旋转动画

<!--
根元素为objectAnimator
propertyName代表动画的类型,和用代码定义的类型一致
valueType:代表传入的值的类型,floatType对应代码中的ofFloat,实际中用floatType就可以了
valueFrom:动画起始值
valueTo:动画结束值
-->
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="rotation"
    android:valueType="floatType"
    android:valueFrom="0"
    android:valueTo="360"
    >
</objectAnimator>

2 透明动画

<!--
根元素为objectAnimator
propertyName代表动画的类型,和用代码定义的类型一致
valueType:代表传入的值的类型,floatType对应代码中的ofFloat,实际中用floatType就可以了
valueFrom:动画起始值,范围从0到1
valueTo:动画结束值
-->
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="alpha"
    android:valueType="floatType"
    android:valueFrom="1"
    android:valueTo="0"
    >
</objectAnimator>

3 缩放动画

<!--
根元素为objectAnimator
propertyName代表动画的类型,和用代码定义的类型一致
valueType:代表传入的值的类型,floatType对应代码中的ofFloat,实际中用floatType就可以了
valueFrom:动画起始值,起始缩放比例
valueTo:动画结束值,结束缩放比例
-->
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="scaleX"
    android:valueType="floatType"
    android:valueFrom="1"
    android:valueTo="2"
    >
</objectAnimator>

4 位移动画

<!--
根元素为objectAnimator
propertyName代表动画的类型,和用代码定义的类型一致
valueType:代表传入的值的类型,floatType对应代码中的ofFloat,实际中用floatType就可以了
valueFrom:动画起始值,起始view左上角横坐标或者纵坐标的位置
valueTo:动画结束值,结束起始view左上角横坐标或者纵坐标的位置
-->
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="translationX"
    android:valueType="floatType"
    android:valueFrom="0"
    android:valueTo="200"
    >
</objectAnimator>

5 动画集合
动画集合只需要把需要的动画放入set标签中即可,而且set标签可以嵌套set标签。
set标签有一个独有的属性
android:ordering
值可以为
sequentially:动画按照set内部写入的动画的顺序依次执行
together:set内部写入的动画一起执行
例如写一个一起执行缩放和位移的动画

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="together">
<objectAnimator
    android:valueType="floatType"
    android:propertyName="scaleX"
    android:valueFrom="1"
    android:valueTo="2"/>
<objectAnimator
    android:propertyName="translationX"
    android:valueType="floatType"
    android:valueFrom="0"
    android:valueTo="200"/>
</set>

用代码定义的动画可以在多个值之间顺序变化,在xml好像没有这种属性,但是用set可以实现这种功能

<!--
android:ordering="sequentially"则set内的动画依次执行
以透明动画为例
可以先从1到0,再从0到1,再从1到0
这样就实现了和用代码定义的一样的在不同值之间变化的功能
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering="sequentially">
<objectAnimator
    android:valueType="floatType"
    android:propertyName="alpha"
    android:valueFrom="1"
    android:valueTo="0"/>
<objectAnimator
    android:valueType="floatType"
    android:propertyName="alpha"
    android:valueFrom="0"
    android:valueTo="1"/>
<objectAnimator
    android:valueType="floatType"
    android:propertyName="alpha"
    android:valueFrom="1"
    android:valueTo="0"/>
</set>

6 执行动画
上面用xml方式定义的5中动画都有统一的执行过程
6.1 获取动画资源

Animator animator= AnimatorInflater.loadAnimator(this,R.animator.animator);

6.2 设置动画执行的目标

animator.setTarget(imageView);

6.3 开始动画

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

推荐阅读更多精彩内容