進階篇-用戶界面: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

相關文章
相關標籤/搜索