Android 动画杂谈(一)

作者: 花前月下的细说 | 来源:发表于2016-11-18 14:12 被阅读86次

    视图动画

    视图动画产生的动画,并不能改变事件响应的位置,它只是单纯地修改了显示,如果使用视图动画,那么按钮的实际点击有效区域还是在原来的地方,点击移动后的地方时不会有点击时间发生的。

    TranslateAnimation ta = new TranslateAnimation(0,200,0,300);
    ta.setDuration(1000);
    ta.setFillAfter(true);
    view.startAnimation(ta);
    

    属性动画
    而属性动画则不一样,由于它真实改变了一个View的属性,所以事件响应的区域也同样发生了改变,这时候点击移动后的按钮,就会响应点击事件了

    ObjectAnimator animator = ObjectAnimator.ofFloat(view,"translationX",300);
            animator.setDuration(300);
            animator.start();
    

    PropertyValuesHolder

    针对同一对象的多个属性,要同时作用多种动画,可以使用PropertyValuesHolder来实现,比如下面的在平移过程中,需要同时改变X,Y轴的缩放,可以这样实现:

    PropertyValuesHolder p1 =PropertyValuesHolder.ofFloat("translation",300f);
    PropertyValuesHolder p2 =PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);
    PropertyValuesHolder p3 =PropertyValuesHolder.ofFloat("scaleY",1f,0,1f);
    ObjectAnimator.ofPropertyValuesHolder(view,p1,p2,p3).setDuration(1000).start();
    

    使用方法类似视图动画的AnimationSet的使用。

    动画事件的监听

    
            ObjectAnimator anima  = ObjectAnimator.ofFloat(view,"alpha",0.5f);
            anima.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) {
    
                }
            });
    

    其各方法的含义根据方法名很显然知道。当然,大部分的时候,我们都只关心onAnimationEnd 事件,所以可以如下这样使用

            ObjectAnimator anima  = ObjectAnimator.ofFloat(view,"alpha",0.5f);
         anima.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
                 super.onAnimationEnd(animation);
             }
         });
    

    可以自由选择我们必要的事件进行监听。

    AnimatorSet

    为了实现更为精确的顺序控制

      ObjectAnimator animator1 = ObjectAnimator.ofFloat(view,"translationX",300f);
            ObjectAnimator animator2 = ObjectAnimator.ofFloat(view,"scaleX",1f,0f,1f);
            ObjectAnimator animator3 = ObjectAnimator.ofFloat(view,"scaleY",1f,0f,1f);
            AnimatorSet set = new AnimatorSet();
            set.setDuration(1000);
            // 同时
            set.playTogether(animator1, animator2, animator3);
            // 按顺序
            set.playSequentially(animator1,animator2,animator3);
            /*
            *  或者通过下面的方法去控制
            * set.play().with()
            * set.play().before()
            * set.play().after()
            * */
            set.start();
    

    相关文章

      网友评论

        本文标题:Android 动画杂谈(一)

        本文链接:https://www.haomeiwen.com/subject/ffzjpttx.html