在我刚开始做移动App开发的时候,事实上,Android端的动画主要有2种:帧动画和补间动画。这两种动画,虽然能实现一些动画效果,然而却都存在着不小的缺陷。伴随着Android3.0的推出,google推出了更为强大的属性动画,前两种动画逐渐被替代。本篇文章也直接省略帧动画和补间动画,着重介绍属性动画。
首先介绍一下,最简单也最常用的几种动画:
//渐变动画
public void runAlphaAnimation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 0.1f, 1.0f);
animator.start();
}
//平移动画
public void runTranslateAnimation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", 0.5f, 80f);
animator.start();
}
//缩放动画
public void runScaleAnimation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "scaleX", 0.1f, 1.0f);
animator.start();
}
//旋转动画
public void runRotateAnimation(View view) {
PropertyValuesHolder yHolder = PropertyValuesHolder.ofFloat("rotationY", 0f, 90f, 180f, 360f);
PropertyValuesHolder xHolder = PropertyValuesHolder.ofFloat("rotationX", 0f, 90f, 180f, 360f);
ObjectAnimator.ofPropertyValuesHolder(view, yHolder, xHolder).setDuration(1000).start();
}
上面四种动画,基本涵盖了补间动画的所有操作。<code>PropertyValuesHolder </code>这个类,需要说明一下。它的作用,是可以把动画临时存储起来,然后播放动画时,同时执行。其效果等同于:
ObjectAnimator xanimator = ObjectAnimator.ofFloat(view, "scaleX", 0.1f, 1.0f);
ObjectAnimator yanimator = ObjectAnimator.ofFloat(view, "scaleY", 0.1f, 1.0f);
AnimatorSet set = new AnimatorSet();
set.play(xanimator).with(yanimator);
除了上面这4种最常用的,还有一种帧动画,我们也会经常需要用到。就是帧动画,可以参考帧动画替代方案这篇文章。不过使用的时候需要在布局文件中添加该控件,否则没有效果。
<com.fragmenttest.LevelImageView
android:id="@+id/image"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginTop="20dp"/>
java文件中:
LevelImageView imageView = (LevelImageView) findViewById(R.id.image);
//设置level资源.
imageView.setImageResource(R.drawable.level_image);
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
//新建动画.属性值从1-10的变化
ObjectAnimator headerAnimator = ObjectAnimator.ofInt(imageView, "imageLevel", 1, 4);
//设置动画的播放数量为一直播放.
headerAnimator.setRepeatCount(ObjectAnimator.INFINITE);
//设置一个速度加速器.让动画看起来可以更贴近现实效果.
headerAnimator.setInterpolator(new LinearInterpolator());
headerAnimator.setRepeatMode(ObjectAnimator.RESTART);
headerAnimator.setDuration(600);
headerAnimator.start();