写在前面
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 旋转动画
2 透明动画
3 缩放动画
4 位移动画
5 动画集合
动画集合只需要把需要的动画放入set标签中即可,而且set标签可以嵌套set标签。
set标签有一个独有的属性
android:ordering
值可以为
sequentially:动画按照set内部写入的动画的顺序依次执行
together:set内部写入的动画一起执行
例如写一个一起执行缩放和位移的动画
用代码定义的动画可以在多个值之间顺序变化,在xml好像没有这种属性,但是用set可以实现这种功能
6 执行动画
上面用xml方式定义的5中动画都有统一的执行过程
6.1 获取动画资源
Animator animator= AnimatorInflater.loadAnimator(this,R.animator.animator);
6.2 设置动画执行的目标
animator.setTarget(imageView);
6.3 开始动画
animator.start();