您的位置:首页 > 移动开发 > Android开发

Android技术进阶的要素——Android属性动画

2016-07-11 16:20 489 查看
由于Android3.0之前就有了许多的动画框架,其中之一就是Animation,但是随着时代的发展和交互要求的提高,Animation的局限性也越来越明显,例如:Anmiation动画不能响应点击事件等等。因此,在Android3.0之后,Google推出了新的动画框架——属性动画(Animator)。

而在Animator框架中使用最多的就是AnimatorSet和ObjectAnimator的配合,使用ObjectAnimator进行更加精细化的控制,只控制一个对象的一个属性值,而使用多个ObjectAnimator组合到AnimatorSet形成一个动画。并且ObjectAnimator能够自动驱动,可以调用SetFrameDelay(longframeDelay)设置动画帧之间的间隙时间,调整帧率,减少动画过程中频繁的绘制界面,而在不影响动画效果的前提下减少了CPU的资源消耗。

接下来就看看属性动画中最基础的ObjectAnimator。

先看看基本的用法格式:

private void oneObjectAnimator(View tv) {
animator = ObjectAnimator.ofFloat(tv, "alpha", 300);
animator.setDuration(300);
animator.start();
}


tv是一个控件,“alpha”是一个字符串格式的属性值,除了这个属性值,还有

translationY 、translationX :这两个属性作为一种增量来控制着View对象从布局容器的左上角坐标偏移的位置

rotation、rotationX、rotationY:控制View对象围绕支点进行2D和3D旋转。

scaleX、scaleY :控制View对象围绕支点进行2D缩放

prvotX、pivotY :控制控件围绕这个点进行缩放变换处理

x、y: 描述的是View对象在它的容器中的最终位置,它最初的左上角坐标和translationY 、translationX值的累积和。

alpha 控制透明度

这个是针对一个对象一个属性的用法,如果是有多个属性,那就要用到PropertyValuesHolder

比如现在要实现一个平移缩放的动画效果,那具体的做法就是:

/**
* 组合式动画,同一个对象的多个属性
*/
public void threeObjectAnimator() {
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat(
"translationX", 300f);

PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f,
0);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f,
0);
ObjectAnimator.ofPropertyValuesHolder(tv, pvh1, pvh2, pvh3)
.setDuration(1000).start();

}


其实用法跟AnimationSet类似,同时,也跟我们后面要讲的AnimatorSet的用法类似。

接下来,再看看另外在属性动画里面占有很重要的地位的类——ValueAnimator

这个类其实相当强大,就连ObjectAnimator也是继承它的。它本身不带有动画效果,但是它能生成许多的有规律的数字,那么我们有了这个数字,当然也可以实现动画的效果了,比如下面的这个用法:

public void oneValueAnimator() {
final ValueAnimator animator =ValueAnimator.ofFloat(0,100);
animator.setTarget(tv);
animator.setDuration(1000).start();
animator.addUpdateListener(new AnimatorUpdateListener() {

@Override
public void onAnimationUpdate(ValueAnimator arg0) {
float value =(float) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = layout.getLayoutParams();
layoutParams.height =(int) value;
layout.setLayoutParams(layoutParams);
}
});
}


这里是通过有这写数据,来不断的设置View的高度,实现一个动画的效果。

最后来看看AnimatorSet,前面提到过,它的用法和PropertyValuesHolder 是很相似的,但是不同的是,它可以实现多个对象和多种属性的同时动画效果,大概的用法如下:

public void oneAnimatorSet(){
ObjectAnimator animator=ObjectAnimator.ofFloat(tv, "translationX", 300f);
ObjectAnimator animator2=ObjectAnimator.ofFloat(tv, "scaleX", 1f,0,1f);
ObjectAnimator animator3=ObjectAnimator.ofFloat(tv, "scaleY",  1f,0,1f);
AnimatorSet set = new AnimatorSet();
set.setDuration(1000);
set.playTogether(animator,animator2,animator3);
set.start();
}


在属性动画中,Animator正是通过playTogether(),with()、before等等方法来控制协调的,这样就是实现对动画播放的顺序精确控制。

今天只是简单的认识一下基本用法,我会在后期的学习中,推出具有实战意义的动画效果。谢谢阅读。

最后,感谢徐宜生大神。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: