本篇文章只是对Android中的动画做一个简单的介绍
Android中的动画重要分为两类:视图动画(View Animation)和属性动画(Property Animation)
其中View Animation又分为补间动画(Tween Animation)和帧动画(Frame Animation、Drawable Animation)
Property Animation中有两种比较重要的类ObjectAnimation和ValueAnimation
比较重要的概念有插值器Interpolator和估值器TypeEvaluator
插值器:设置属性值的变化趋势
估值器:设置属性值的具体变化值
视图动画只能由view使用,有一定的局限性,属性动画可以是任意对象调用
下面来简单看下用法
1、补间动画
补间动画就是对view执行平移、翻转、透明度、缩放动画效果的
需要注意的是,仅仅是改变了view的位置,view的属性还是保持原状,比如点击事件还是在原来的位置生效
有两种设置方法,我们这里一般是在xml中配置
在res/anim文件夹下新建xml文件
<?xml version="1.0" encoding="utf-8"?>
<!--interpolator:差值器,表示动画运行时的时间正常方式,fillAfter:表示动画停留在最后运动的结果-->
<!--java类 xml id值 描述-->
<!--AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 动画始末速率较慢,中间加速-->
<!--AccelerateInterpolator @android:anim/accelerate_interpolator 动画开始速率较慢,之后慢慢加速-->
<!--AnticipateInterpolator @android:anim/anticipate_interpolator 开始的时候从后向前甩-->
<!--AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 类似上面AnticipateInterpolator-->
<!--BounceInterpolator @android:anim/bounce_interpolator 动画结束时弹起-->
<!--CycleInterpolator @android:anim/cycle_interpolator 循环播放速率改变为正弦曲线-->
<!--DecelerateInterpolator @android:anim/decelerate_interpolator 动画开始快然后慢-->
<!--LinearInterpolator @android:anim/linear_interpolator 动画匀速改变-->
<!--OvershootInterpolator @android:anim/overshoot_interpolator 向前弹出一定值之后回到原来位置-->
<!--PathInterpolator 新增,定义路径坐标后按照路径坐标来跑。-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:interpolator="@android:anim/cycle_interpolator">
<!--透明度标签:表示透明0到不透明1之间的变换-->
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0" >
</alpha>
<!--旋转标签:fromDegrees:表示旋转角度的起始角度,toDegrees:结束角度。pivotX:表示旋转的X轴坐标;pivotY:表示旋转的Y轴坐标-->
<rotate
android:fromDegrees="0.0"
android:toDegrees="720"
android:pivotX="50%"
android:pivotY="50%"/>
<!--缩放标签:fromXScale,toXScale表示水平缩放的起始值和结束值;fromYScale,toYScale竖直方向的缩放起始值和结束值。
pivotX,pivotY,表示缩放动画效果的基准点x,y轴
-->
<scale
android:fromXScale="0.4"
android:fromYScale="0.4"
android:toXScale="1.2"
android:toYScale="1.2"
android:pivotX="50%"
android:pivotY="50%">
</scale>
<!--移动标签:fromXDelta,toXDelta表示x轴移动的像素点;fromYDelta,toYDelta表示Y轴移动的像素点-->
<translate
android:fromXDelta="0"
android:toXDelta="300"
android:fromYDelta="0"
android:toYDelta="300"
>
</translate>
</set>
view使用这个动画
ImageView image = findViewById(R.id.img);
Animation animation = AnimationUtils.loadAnimation(this,R.anim.view_animation_test);
animation.setDuration(10000);//设置持续事件
image.startAnimation(animation);
2、帧动画
帧动画有点像幻灯片,不适用于大图片使用,容易出现OOM
在res/drawable文件夹下新建文件
<?xml version="1.0" encoding="utf-8"?>
<!--
根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
根标签下,通过item标签对动画中的每一个图片进行声明
android:duration 表示展示所用的该图片的时间长度
-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item android:drawable="@drawable/d1" android:duration="500"/>
<item android:drawable="@drawable/d2" android:duration="500"/>
<item android:drawable="@drawable/d3" android:duration="500"/>
<item android:drawable="@drawable/d4" android:duration="500"/>
<item android:drawable="@drawable/d5" android:duration="500"/>
</animation-list>
view使用这个动画
image.setImageResource(R.drawable.drawable_animation);
AnimationDrawable animationDrawable = (AnimationDrawable) image.getDrawable();
animationDrawable.start();
3、属性动画
属性动画中有两个重要的类
ObjectAnimation:先设置属性值,自动赋值给对象
ValueAnimation:先设置属性值,手动赋值给对象属性
简单用法:
final ImageView pimg = findViewById(R.id.p_img);
/*ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(pimg,"alpha",1.0f,0.3f);
objectAnimator.setDuration(5000);
objectAnimator.setStartDelay(3000);
objectAnimator.start();*/
/*ValueAnimator animator = ValueAnimator.ofFloat(0f, 100f);
animator.setDuration(5000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//百分比对应的值
float value = (float) animation.getAnimatedValue();
Log.e("TAG", "onAnimationUpdate: " + value);
pimg.setScaleX(0.5f + value / 200);
pimg.setScaleY(0.5f + value / 200);
}
});
animator.start();*/
ObjectAnimator animator1 = ObjectAnimator.ofFloat(pimg, "translationX", 0f, 100f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(pimg, "alpha", 0f, 1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(pimg, "scaleX", 0f, 1f);
animator3.setRepeatCount(ValueAnimator.INFINITE);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(5000);
//动画1,2同时执行
animatorSet.play(animator1).with(animator2);
//动画2执行完成后执行动画3
animatorSet.play(animator3).after(animator2);
animatorSet.start();
对于ofFloat()函数那些不作进一步说明,有兴趣的可以去这里查看