Android动画
目录
- Android视图动画
- Android属性动画
- Android布局动画
- Interpolators(插值器)
1.Android视图动画
介绍
视图动画使用简单,效果丰富,它提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四种动画方式,并提供了AnimationSet动画集合,混合使用多种动画
优点
效率高、使用方便
缺点
不具备交互性
透明度动画
// 参数表示透明度从0变到1
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(1000);
旋转动画
// 从左到右依次是x和y从哪个角度旋转到哪个角度,相对于自身x、y的中心点进行旋转
TranslateAnimation translateAnimation = new TranslateAnimation(0, 40, 0, 40,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
translateAnimation.setDuration(1000);
位移动画
// 从左到右依次是x和y从起始坐标移到最终目标
TranslateAnimation translateAnimation = new TranslateAnimation(0, 40, 0, 40);
translateAnimation.setDuration(1000);
缩放动画
// 前面四个参数分别表示x、y方向缩放倍数的起始和终止值
ScaleAnimation scaleAnimation = new ScaleAnimation(0, 2, 0, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(1000);
动画集合
// 这种集合动画只能使动画同时进行;true表示使用AnimationSet的插值器,false表示使用各自的插值器
AnimationSet animationSet = new AnimationSet(false);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(rotateAnimation);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(scaleAnimation);
view.startAnimation(animationSet);
2.Android属性动画
介绍
由于Android3.0之前已有的动画框架Animation存在一些局限性------动画改变得知识显示,并不能响应事件。因此,在Android3.0之后,Google就提出了属性动画这样一个新的动画框架,帮助开发者实现更加丰富的动画效果
优点
能够响应事件,和用户进行交互;对动画的属性能够实现更加精细的控制
缺点
效率可能没有视图动画好
ObjectAnimator
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btn_0, "translationX", 300).setDuration(300);
如上所示,ObjectAnimator对象可通过Object
Animator类的静态工厂方法进行创建,第一个参数是执行动画的目标view,第二个参数是要操作的属性(该属性必须具有get、set方法,不然ObjectAnimator就无法起效),第三个是不定长的float参数,用于控制属性的变化,依次变化。下面是一些常用的可以直接使用属性动画的属性值:
- translationX和translationY:分别控制View对象左上角坐标偏移的距离
- scaleX和scaleY:控制View对象围绕它的支点进行2D缩放
- pivotX和pivotY:控制View对象的支点位置,使View能够围绕这个支点进行旋转和缩放处理。默认情况下,该支点的位置就是View对象的中心点
- x和y:描述了View对象在它容器中的最终位置,他是最初的左上角坐标和translationX、translationY的累计和
- alpha:控制View对象的透明度,默认值1(不透明),0代表完全透明
PropertyValuesHolder
类似于视图动画的AnimationSet,可以组合多个动画,但是动画的顺序无法控制,只能同时发生
AnimatorSet
它也可以组合动画,而且可以让动画有序执行,playTogether
方法可以让若干动画一起执行,而play、with、before、after可以控制动画的执行顺序,使用时最好两两一起使用,因为若写到一块好像会出现动画执行顺序错乱的问题:
//让1,2,3,5动画依次执行
animatorSet.play(animator1).before(animator2);
animatorSet.play(animator2).before(animator3);
animatorSet.play(animator3).before(animator4);
//让1,2,3,4动画同时执行
animatorSet.playTogether(animator1, animator2, animator3, animator4);
属性动画初始化有两种方式,一种是使用ObjectAnimator类进行初始化;一种是通过xml方式:
//通过ObjectAnimator类
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btn_0, "translationX", 300);
//通过xml方式
Animator animator1 = AnimatorInflater.loadAnimator(MainActivity.this, R.animator.custom_animator1);
animator1.setTarget(btn_0);
ValueAnimator
ValueAnimator本身不提供任何动画效果,它更像是一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程(ObjectAnimator就是继承自ValueAnimator)。通常情况下,在ValueAnimator的AnimatorUpdateListener中监听数值的变换,从而完成动画的变换,一般使用方法如下所示:
ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,100);
valueAnimator.setTarget(btn_0);
valueAnimator.setDuration(1000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value=(Float)animation.getAnimatedValue();
//TODO use the value
...
}
});
动画事件的监听
可以通过两种方式实现对动画的监听:
- AnimatorListener
- AnimatorListenerAdapter
下面是两种方式的示例代码:
//AnimatorListener
animatorSet.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) {
}
});
//AnimatorListenerAdapter:可以有选择的实现想要实现的方法
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
...
}
});
3.Android布局动画
所谓布局动画,就是作用在ViewGroup上,给ViewGroup增加View时添加一个动画过渡效果,最简单的布局动画Android默认的显示过度动画,可通过在xml中添加一行代码实现:
android:animateLayoutChanges="true";
另外,还可以通过LayoutAnimationController类来定义一个子View的过渡效果,代码如下所示:
LinearLayout layout = findViewById(R.id.layout);
ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1, 0, 1);
scaleAnimation.setDuration(2000);
LayoutAnimationController controller = new LayoutAnimationController(scaleAnimation, 1);
controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
layout.setLayoutAnimation(controller);
LayoutAnimationController的第一个参数是需要作用的动画,第二个参数是每个子View显示的delay时间,当delay不为0时,可以设置子View的显示顺序,若为0,则子View将同时执行动画
子View的显示顺序有三种,分别是:
- LayoutAnimationController.ORDER_NORMAL------顺序
- LayoutAnimationController.ORDER_RANDOM------乱序
- LayoutAnimationController.ORDER_REVERSE------反序
4.插值器
插值器是动画中一个很重要的概念,通过插值器,可以定义动画变换速率
Android中已经提供了很多类型的插值器,如果想要自定义插值器的话,要实现Interpolator,并重写getInterpolator()方法
来源:https://blog.csdn.net/Chushiniudao/article/details/102729593