Android动画-1

梦想的初衷 提交于 2019-12-02 06:23:36

Android动画


目录

  1. Android视图动画
  2. Android属性动画
  3. Android布局动画
  4. 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参数,用于控制属性的变化,依次变化。下面是一些常用的可以直接使用属性动画的属性值:

  1. translationX和translationY:分别控制View对象左上角坐标偏移的距离
  2. scaleX和scaleY:控制View对象围绕它的支点进行2D缩放
  3. pivotX和pivotY:控制View对象的支点位置,使View能够围绕这个支点进行旋转和缩放处理。默认情况下,该支点的位置就是View对象的中心点
  4. x和y:描述了View对象在它容器中的最终位置,他是最初的左上角坐标和translationX、translationY的累计和
  5. 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的显示顺序有三种,分别是:

  1. LayoutAnimationController.ORDER_NORMAL------顺序
  2. LayoutAnimationController.ORDER_RANDOM------乱序
  3. LayoutAnimationController.ORDER_REVERSE------反序

4.插值器

插值器是动画中一个很重要的概念,通过插值器,可以定义动画变换速率

Android中已经提供了很多类型的插值器,如果想要自定义插值器的话,要实现Interpolator,并重写getInterpolator()方法

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!