Android属性动画
2016-06-22 本文已影响298人
咸鱼而已
1、概述
Android常用的动画有View Animation、Drawable Animation、Property Animation。
- View Animation:视图动画,通过重绘View来实现的。适合一些没有用户交互的界面使用。
- Drawable Animation:类似cocos2dx中的帧动画。
- Property Animation:属性动画通过对目标对象的属性进行实时修改达到动画效果。
2、相关的API
- Animator:创建属性动画的基类,是一个抽象类
- ValueAnimator:动画执行类。内部采用一种时间循环的机制来计算值与值之间的动画过度,我们需要提供一个起始值以及一个结束值,并设置动画时长,该类会自动帮我们完成从起始值平滑过渡到结束值这样的效果。
- ObjectAnimator:ValueAnimator的子类,允许我们对指定的属性执行动画。
- AnimatorSet:Animator的子类,用于组合多个Animator,可以制定多个Animator按照次序播放还是同时播放。
- Evaluator:一个计算器(这个暂时没用到,先不深究)。
上面是相关类,下面是先关的接口方法:
-
Duration:动画的持续时间,接口方法
animator.setDuration(6000);
-
TimeInterpolation: 定义动画变化速率的接口,所有插值器都必须实现此接口,如线性、非线性插值器
animator.setInterpolator(new BounceInterpolator())
-
Repeat Country and behavoir:重复次数与方式,如播放3次、5次、无限循环,可以让此动画一直重复,或播放完时向反向播放
animator.setRepeatCount(1)
还有一个animator.setRepeatMode(Animation.REVERSE)
- Animation sets:动画集合,即可以同时对一个对象应用多个动画,这些动画可以同时播放也可以对不同动画设置不同的延迟;
动画播放过程中的监听事件回调:
-
addUpdateListener:这个方法是在ValueAnimator这个类中实现的。这个监听会返回这个动作中的变化的中间值。然后可以利用这个中间值做一些界面操作
```
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float) valueAnimator.getAnimatedValue();//获取当前变化中间值
Log.d("zwf", "" + value);testImg.setTranslationX(value); } }); ```
-
addListener:这个方法可以接收一个参数,我们可以穿进去一个AnimatorListener或者一个AnimatorListenerAdapter,前一个是一个接口,后一个是一个抽象类,实现了前一个的接口。通过这个方法,基本上可以获取到动画播放所有过程的监听。
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) { //动作取消
super.onAnimationCancel(animation);
}
@Override
public void onAnimationEnd(Animator animation) { //动作结束
super.onAnimationEnd(animation);
Log.d("zwf", "animator end!");
//动作停止后移除图片
/*ViewGroup parent = (ViewGroup) testImg.getParent();
if (parent != null){
parent.removeView(testImg);
}*/
}
@Override
public void onAnimationRepeat(Animator animation) { //动作重复
super.onAnimationRepeat(animation);
}
@Override
public void onAnimationStart(Animator animation) { //动作开始
super.onAnimationStart(animation);
Log.d("zwf", "animator start!");
}
@Override
public void onAnimationPause(Animator animation) { //动作暂停
super.onAnimationPause(animation);
}
@Override
public void onAnimationResume(Animator animation) { //动作重新开始
super.onAnimationResume(animation);
}
});
AnimationSet中的一些常用方法:
set.play(animator1).with(animator2).with(animator3); //三个动作同时播
set.play(animator3).after(animator2); //先播2在播3
set.playSequentially(animator1, animator2, animator3); //三个动作顺序播
set.playTogether(animator1, animator2, animator3); //三个动作同时播
3、ObjectAnimaton的使用
先看效果图:

注意:我是在一个Fragment中,添加的ImageView
看一下主要部分代码:
public class AnimatorFragment extends Fragment implements View.OnClickListener {
public static final int FRAG_TYPE = 5;
//初始化图片的id
private int[] idList = new int[]{R.id.id_img_a, R.id.id_img_b, R.id.id_img_c, R.id.id_img_d,
R.id.id_img_e, R.id.id_img_f, R.id.id_img_g, R.id.id_img_h};
//这个List用来存ImageView
private List<ImageView> imageViewList = new ArrayList<>();
public static AnimatorFragment newInstance() {
return new AnimatorFragment();
}
public AnimatorFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_animator, container, false);
initViews(rootView);
ButterKnife.inject(this, rootView);
return rootView;
}
//获取ImageView
public void initViews(View rootView) {
for (int i = 0; i < 8; i++) {
ImageView imageView = (ImageView) rootView.findViewById(idList[i]);
imageViewList.add(imageView);
imageView.setOnClickListener(this);
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.id_img_h:
startAnimator();
break;
default:
Toast.makeText(getActivity(), "view" + view.getId(), Toast.LENGTH_LONG);
break;
}
}
//动画操作实现
public void startAnimator() {
for (int i = 0; i < 7; i++) {
double x = Math.sqrt((90000 - i * 50 * i * 50));
ObjectAnimator horizontalAnimator = ObjectAnimator.ofFloat(imageViewList.get(i),
"translationX", 0, (int)x);
horizontalAnimator.setDuration(700);
ObjectAnimator vertocalAnimator = ObjectAnimator.ofFloat(imageViewList.get(i),
"translationY", 0, i * 50);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(imageViewList.get(i), "scaleX", 1f,0.5f);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(imageViewList.get(i), "scaleY", 1f,0.5f);
vertocalAnimator.setDuration(700);
AnimatorSet set = new AnimatorSet();
set.playTogether(horizontalAnimator, vertocalAnimator, scaleX, scaleY);
set.start();
}
}
}