Android应用层(View体系)二

1.Android属性动画

Animator框架中使用最多的就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更精细化的控制,控制一个对象和一个属性值,而使用多个ObjectAnimator组合到AnimatorSet形成一个动画,

属性动画通过调用属性get,set方法来真实地控制了一个View的属性值,因此强大的属性动画框架,基本可以实现所有的动画效果

## ObjectAnimator
- 创建一个ObjectAnimator只需通过他的静态工厂类直接返还一个ObjectAnimator对象。
- 参数包括一个对象和对象的属性名字,但这个属性必须有get和set函数,内部会通过java反射机制来调用set函数修改对象的属性值。

#### Step 1 : 实现平移的属性动画
“`
ObjectAnimator mObjectAnimator=ObjectAnimator.ofFloat(view,”translationX”,200);
mObjectAnimator.setDuration(300);
mObjectAnimator.start();

- 第一个对象是要**操作的View**
- 第二个参数则是要**操纵的属性**
- 最后一个参数是一个**可变的数组参数**,需要传进去一个该属性变化的一个取值的过程

###### 常见的属性动画的属性值
- translationX和translationY:这两个属性作为增量控制View对象从他的布局容器的左上角开始位置。
- rotation、rotationX、rotationY:这三个属性控制View对象围绕它的支点进行2D和3D旋转。
- PrivotXPrivotY:控制View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认该支点位置就是View对象的中心点。
- alpha:透明度,默认是1(不透明),0代表完全透明。
- x和y:描述View对象在它容器中的最终位置,它是最初的做上角座标和translationX,translationY值的累计的和。

#### Step add : 也可以通过自定义一个属性类或包装类间接的增加get和set方法
1. 自定义的属性类

private static class MyView{
private View mTarget;
private MyView(View mTarget){
this.mTarget=mTarget;
}
public int getWidth(){
return mTarget.getLayoutParams().width;
}
public void setWidth(int width){
mTarget.getLayoutParams().width=width;
mTarget.requestLayout();
}
}

2. 使用

MyView mMyView=new MyView(mButton);
ObjectAnimator.ofInt(mMyView,”width”,500).setDuration(500).start();


## ValueAnimator
> ValueAnimator不提供任何动画效果,它更像一个数值发生器,用来产生一定规律数字,从而让调用者来控制动画的实现过程。

#### Step 1 : 在ValueAnimator的AnimatorUpdateListener中监听数值的变化,从而完成动画的变换:

ValueAnimator mValueAnimator=ValueAnimator.ofFloat(0,100);
mValueAnimator.setTarget(view);
mValueAnimator.setDuration(1000).start();
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float mFloat=(Float)animation.getAnimatedValue();
}
});
}


### 动画监听
完整的动画具有start,Repeat,End,Cancel四个过程:

ObjectAnimator animator=ObjectAnimator.ofFloat(view,”alpha”,1.5f);
animator.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) {
}
});
}


大部分时候我们只关心onAnimationEnd事件,android也提供了AnimatorListenterAdaper来让我门选择必要的事件进行监听:

ObjectAnimator animator=ObjectAnimator.ofFloat(view,”alpha”,1.5f);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});


## 组合动画-AnimatorSet
向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
- after(Animator anim) 将现有动画插入到传入的动画之后执行
- after(long delay) 将现有动画延迟指定毫秒后执行
- before(Animator anim) 将现有动画插入到传入的动画之前执行
- with(Animator anim) 将现有动画和传入的动画同时执行

ObjectAnimator animator1 = ObjectAnimator.ofFloat(mCustomView, “translationX”, 0.0f, 200.0f, 0f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(mCustomView, “scaleX”, 1.0f, 2.0f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(mCustomView, “rotationX”, 0.0f, 90.0f, 0.0F);
AnimatorSet set=new AnimatorSet();
set.setDuration(1000);
set.play(animator1).with(animator2).after(animator3);
set.start();


## xml中使用属性动画
和视图动画一样,属性动画也可以直接写在xml中:
在res文件中新建animator文件,在里面新建一个scale.xml,里面的内容如下:


程序中引用xml定义的属性动画:

Animator animator=AnimatorInflater.loadAnimator(this,R.animator.scale);
animator.setTarget(view);
animator.start();
“`

发布了34 篇原创文章 · 获赞 5 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章