Android 属性动画(一)

来源:互联网 发布:微信公众平台源码下载 编辑:程序博客网 时间:2024/05/21 04:20

网上关于属性动画的博客也算是很多了,看过之后,然后自己去用的过程中还是感觉不是很详细,因为有些东西还是需要自己实践过之后才会发现。(要api11之后才可以使用,由于市场上手机基本是4.0以上的系统了,所以以后写动画可以直接用属性动画)

关于动画应该分为补间动画、帧动画、属性动画;
补间动画中存在着平移动画、缩放动画、旋转动画、渐变动画。属性动画中也包含这些,然而为何google为何又要弄出属性动画来,原因还是比较多的,先举个最简单的例子:
补间动画中平移动画,一个按钮移动后,使用setFillAfter停留在最后位置,如果你按钮设置点击事件,你会发现点击停留后位置的按钮是无法触发点击事件的,但是点击按钮原来位置可以触发点击事件。而属性动画是可以在最后停留位置触发点击事件的。这里就不贴代码了,自己可以去试试。

对于属性动画对于类似补间动画的类似效果我们可以使用ObjectAnimatorValueAnimator来实现。
打开ObjectAnimator源码可以发现,它其实是ValueAnimator的子类,对其进一步的封装。
本篇主要讲解ObjectAnimator。ValueAnimator的讲解后续再给补上

这里写图片描述

(1)平移
属性名包含translationX、translationY、X、Y(ps:我试了一下属性名translation,log中会错误,即translation属性名是不存在的)

首先说下都是平移为什么会有translationX和X两种属性名,它们的区别在于前者为相对位置,后者为绝对位置
将图片放在布局的中央
对比一下两种属性可以发现其中的差别

ObjectAnimator.ofFloat(iv,"translationX",0.0f,300.0f).setDuration(1000).start();ObjectAnimator.ofFloat(iv,"X",0.0f,300.0f).setDuration(1000).start();

translationX为相对位置的X=0坐标开始移动300
X则为绝对位置(即窗口的X=0坐标)开始移动300
translationY和Y的差别原理相同
我们查看下ObjectAnimator.ofFloat的源码

这里写图片描述
查看到源码我们可以看到,最后传的值是float… ,可以传递多个float类型的值,其中主要是传一个值及多个值中存在着区别

我分别写了如下代码进行对比:
这里写图片描述

这里写图片描述

mAnimator = ObjectAnimator.ofFloat(iv,”translationY”,300f);这段代码,执行完之后,再次执行将会发现图片不会再动,其实动画仍然是执行了,只是起value值一直为300,(第一次则是从0开始到300),对比一下两次的Log便可以发现
第一次执行开始以及结束:
这里写图片描述

这里写图片描述
第二次执行开始以及结束:
第二次执行开始以及结束:

这里写图片描述

mAnimator = ObjectAnimator.ofFloat(iv,"translationY",0f,300f);mAnimator = ObjectAnimator.ofFloat(iv,"translationY",0f,300f,100f);mAnimator = ObjectAnimator.ofFloat(iv,"translationY",0f,300f,100f,200f);

这三个其实就都是从相对位置0坐标开始,到达最后的位置,中间的值便是从上一个坐标到达该坐标,最终到达终点坐标位置。每次位移距离则是后者减去前者的值。

(2)旋转
属性名包含rotation、rotationX、rotationY
除属性名外其他与平移用法相同
rotation:默认为以view的中心点旋转(可以设置为某个点),为2d旋转
rotationX:以view的X中心轴进行旋转,3d旋转
rotationY:以view的Y中心轴进行旋转,3d旋转

//以特定的位置设置为旋转中心点mAnimator =  ObjectAnimator.ofFloat(iv,"rotation",0.0f,-360.0f,0f);iv.setPivotX(300);//设置指定旋转中心点X坐标iv.setPivotY(300);//设置指定旋转中心点Y坐标mAnimator.setDuration(1000).start();//3d旋转 360度(以X轴中心) ObjectAnimator.ofFloat(iv,"rotationX",0.0f,360.0f).setDuration(1000).start(); //3d旋转 360度(以Y轴中心) ObjectAnimator.ofFloat(iv,"rotationY",0.0f,360.0f).setDuration(1000).start();

(3)缩放
属性名包含scaleX、scaleY(本以为存在scale属性同时缩放X方向和Y方向,试过之后发现是不存在的)
除属性名外其他与平移用法相同

//X方向缩放ObjectAnimator.ofFloat(iv,"scaleX",1.0f,2.0f).setDuration(1000).start();//Y方向缩放ObjectAnimator.ofFloat(iv,"scaleY",0.0f,2.0f).setDuration(1000).start();

(4)淡入淡出
属性名alpha

ObjectAnimator.ofFloat(iv,"alpha",0f,1f).setDuration(1000).start();

(5)动画监听器
细心的朋友应该在讲平移动画的时候看到了这么几行代码:

mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {                    @Override                    public void onAnimationUpdate(ValueAnimator animation) {                        float value = (float) animation.getAnimatedValue();                        Log.i(TAG,""+value);                    }                }); mAnimator.addListener(new MyAnimatorListenerAdapter()); mAnimator.addPauseListener(new MyAnimatorListenerAdapter());

这些listener还是很重要的,我们可以在这些状态中进行一些复杂的操作。addUpdateListener是监听动画执行中值的变化;addListener则是监听动画的开始、取消、结束、重复;addPauseListener则是监听动画的暂停、恢复

其实动画是有几种状态的分别为

 boolean isStarted()  // 开始状态(需api14及以上才可使用) boolean isRunning()  // 执行中状态 boolean isPaused()   // 暂停状态需(api19及以上才可使用)

动画执行动作可分为:

Animator.start()   // 开始动画Animator.end()     // 结束动画Animator.cancel()  // 取消动画Animator.pause()   // 暂停动画(需api19及以上才可使用)Animator.resume()  // 暂停后恢复动画(需api19及以上才可使用)

详细可以查看这篇文章

(补充)
Animator还存在着延时开始
Animator.setStartDelay(1000);
重复次数
setRepeatCount(2);
重复的模式
Animator.setRepeatMode(ValueAnimator.REVERSE);
差值器
Animator.setInterpolator(new LinearInterpolator());

以及使用xml来创建动画

后面会详细讲解。

这篇就写到这里吧。

0 0