进阶篇-用户界面: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);
            }
        });

    }
}

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