进阶篇-用户界面:8.android动画-动画侦听和自定义动画

1.动画的过程侦听java

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);
            }
        });

    }
}

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

2.自定义动画效果app

安卓只给开发者提供了四种动画效果,虽然这几个动画效果能够叠加,混合,可是这些效果仍是远远不能知足开发者的需求。因此咱们有必要去自定义动画效果,创造无穷无尽的动画效果。个人动画效果,无穷无尽!ide

咱们在这里自定义一个摇头的动画效果,一样用一个按钮实现。实现的效果来相似于输错密码以后按钮左右抖动的效果。函数

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

MyAnimation.java:spa

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:code

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);
            }
        });

    }
}

 

 

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

相关文章
相关标签/搜索