属性动画Animator框架是在Android 3.0 之后,谷歌加入的.
在Animator框架中使用最多的就是AnimatorSet 和 ObjectAnimator 配合使用,ObjectAnimator 可以精细的控制一个对象的某一个属性,而可以使用多个 ObjectAnimator , 组合到 AnimatorSet 中形成组合动画。其中最重要的是:属性动画是通过调用属性的 get , set 方法来真实的控制View的属性值!
1.ObjectAnimator
ObjeAnimator是属性动画中最重要的实行类,创建一个ObjectAnimator 只需要通它的静态工厂类直接返回一个 ObjectAnnimator
对象。
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "translationX", 300);
objectAnimator.setDuration(2000);
objectAnimator.start();
它的参数包括要使用动画的对象,属性名称,注意这个属性名称一定要有 get , set 方法,因为属性动画是通过 Java 反射机制来通过 set 方法来修改属性值的。 大概的知识点 上面的例子也都包括了,其他的只要修改属性名称就行了。当然,属性动画也和视图动画一样可以设置,差值器,时长,等属性。
1.1 translationX , translationY : 这两个属性是里 控制 View 对象 从它布局容器的左上角坐标偏移位置。
1.2 rotation , rotationX ,rotationY : 控制View 对象围绕支点进行 2D ,3D 旋转。
1.3 scaleX , scaleY : 控制View对象 2D 的缩放。
1.4 pivotX , pivotY : 控制View 对象的支点位置,围绕支点进行旋转和缩放
1.5 x , y :它描述了View 对象在容器中的最终位置,它是最初的左上角的值 与 translationX,Y 的累计和
1.6 alpha : View 的透明度,默认为1,完全不透明, 0 完全透明。
这些属性都是可以直接用的,但是如果没有get , set 方法呢?这也是可以解决的。我们可以通过一个包装类,来给某一属性设置 get , set 方法。例如,View的width属性
private static class Wrapper{ // 此类必须为 静态 否则将找不到该属性
private View mTagView;
public Wrapper(View mTagView) {
this.mTagView = mTagView;
}
public int getWidth(){
return mTagView.getLayoutParams().width;
}
public void setWidth(int width){
mTagView.getLayoutParams().width = width;
mTagView.getLayoutParams().height = width;
mTagView.requestLayout();
}
}
这时就可以使用width属性了
Wrapper wrapper =new Wrapper(mImageView);
ObjectAnimator.ofInt(wrapper,"width",500).setDuration(2000).start();
2.ValueAnimator
ValueAnimator 在属性动画中占有非常重要的地位,因为它是核心所在,ObjectAnimator 就是继承它的。
ValueAnimator本身不具备任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数值,从而让调用者来控制动画实现过程。
3.动画的监听
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) { // 开始时调用
}
@Override
public void onAnimationEnd(Animator animation) { // 结束时 调用
}
@Override
public void onAnimationCancel(Animator animation) { // 取消时调用
}
@Override
public void onAnimationRepeat(Animator animation) { // 重复时调用
}
});
监听动画的状态,但是一般我们只要知道动画什么时候结束就行了,谷歌也提供了相应的方法
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
这样就只复写一个方法了。
4. AnimatorSet
对一个对象同时作用多个属性操作,可以控制播放顺序。有palyTogether() , playSequentially() , paly() ,
with() , before() , after() .
ObjectAnimator translationXAnimator = ObjectAnimator.ofFloat(mImageView, "translationX", 300);
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageView, "alpha",0,1);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playTogether(translationXAnimator,alphaAnimator);
animatorSet.start();