zoukankan      html  css  js  c++  java
  • 进阶篇-用户界面:8.android动画-动画侦听和自定义动画

    1.动画的过程侦听

    public class MainActivity extends AppCompatActivity {
        private AnimationSet as;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            as = new AnimationSet(true);
            as.setDuration(1000);
    
            AlphaAnimation aa = new AlphaAnimation(0,1);
            //aa.setDuration(5000);
            as.addAnimation(aa);
    
            TranslateAnimation ta = new TranslateAnimation(200,0,200,0);
           // ta.setDuration(5000);//经过试验,这句加不加都行
            as.addAnimation(ta);
    
            findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    as.setAnimationListener(new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
    
                        }
    
                        @Override
                        public void onAnimationEnd(Animation animation) {
    
                        }
    
                        @Override
                        public void onAnimationRepeat(Animation animation) {
    
                        }
                    });
    
                    view.startAnimation(as);
                }
            });
    
        }
    }

    添加了监听的回调函数之后,实现三个方法,分别是动画开始时执行……动画结束后执行……动画重复时执行……

    2.自定义动画效果

    安卓只给开发者提供了四种动画效果,虽然这几个动画效果可以叠加,混合,但是这些效果还是远远不能满足开发者的需求。所以我们有必要去自定义动画效果,创造无穷无尽的动画效果。我的动画效果,无穷无尽!

    我们在这里自定义一个摇头的动画效果,同样用一个按钮实现。实现的效果来类似于输错密码之后按钮左右抖动的效果。

    (1)新建一个类MyAnimation继承Animation类

    MyAnimation.java:

    import android.view.animation.Animation;
    import android.view.animation.Transformation;
    
    /**
     * Created by lzc on 16/7/4.
     */
    public class MyAnimation extends Animation {
    
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            System.out.println(interpolatedTime);//这句的意思是,在加载此类时,applyTrasformation会执行n多次,输出的效果时float类型的数据从0到1.
    
            //t.getMatrix().setTranslate(200*interpolatedTime,200*interpolatedTime);//这个方法本身是直接设定位置,由于applyTrasformation在不断执行,所以它也在不断的设定位置,如果参数是200,200,它会从
                                                                          //(0,0)直接跳到(200,200).但是如果乘了interpolatedTime,他就会慢慢位移到(200,200).
    
            t.getMatrix().setTranslate((float)(Math.sin(interpolatedTime*20)*50),0);//y轴不动,x轴呈现周期性移动
    
            super.applyTransformation(interpolatedTime, t);
        }
    }

    MainActivity.java:

    public class MainActivity extends AppCompatActivity{
        private MyAnimation ma;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ma = new MyAnimation();
            ma.setDuration(5000);
    
            findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    view.startAnimation(ma);
                }
            });
    
        }
    }

    我终于体会到程序里面数学的重要性了。实现一个周期性位移要用到三角函数,要调整振幅周期甚至相位,不学数学,玩个屁程序。不说了,学数学去了。

  • 相关阅读:
    BUU MISC 刷题记录 (一)
    BUU MISC 刷题记录(三)
    2021/8/18 随笔(区间互质)
    2021/8/17随笔
    连通图与Tarjan算法
    【tarjan/v-DCC】Redundant Paths POJ
    ACM OJ常见错误以及解决方法
    【鸽巢原理】Halloween treats HDU
    frp&nps实现socks5代理
    零组文库签到+腾讯云函数+钉钉推送
  • 原文地址:https://www.cnblogs.com/androidNot/p/5640521.html
Copyright © 2011-2022 走看看