Android 动画杂谈(一)

视图动画

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

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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,900评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,333评论 4 61
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 7,664评论 0 10
  • 第三次了,老天眷顾又残忍,每次都不在您身边。我不知道那是简单的意外,还是我此生最痛的嘲弄。每一次,都是悬崖边的……...
    烟雨江岚阅读 1,319评论 0 0
  • 历史 地理 化学 物理 生物 ;政治 英语 语文 数学
    xy78阅读 1,267评论 0 0