寫這篇文章的初衷也是加強(qiáng)對(duì)插值器和估值器的記憶婉徘。
其實(shí)對(duì)于插值器和估值器來(lái)說(shuō),除了系統(tǒng)提供的以外敬矩,我們可以自定義概行。實(shí)現(xiàn)方式也很簡(jiǎn)單。因?yàn)椴逯灯骱凸乐灯鞫贾皇且粋€(gè)接口弧岳。并且內(nèi)部只有一個(gè)方法凳忙。我們只要實(shí)現(xiàn)接口就可以了,就可以做出很多絢麗的動(dòng)畫了禽炬。其中涧卵,自定義插值器需要實(shí)現(xiàn) Interpolator或者TimeInterpolator,自定義估值器 需要實(shí)現(xiàn)TypeEvaluator腹尖。
但是一般來(lái)說(shuō)柳恐,插值器使用系統(tǒng)的就足夠了,估值器自定義的可能會(huì)多一些热幔,另外就是如果要對(duì)其他類型(非Int丶float丶color)做動(dòng)畫胎撤,必須使用自定義估值器算法。
在這里我們實(shí)現(xiàn)拋物線軌跡是 固定時(shí)間的拋物線(球按照拋物線軌跡運(yùn)行1.5秒)断凶。其目的主要是為了熟練使用自定義估值器。
步驟一:因?yàn)槭且粋€(gè)控件的運(yùn)動(dòng)軌跡巫俺,肯定要涉及到點(diǎn)的坐標(biāo)(x,y),所以首先要建一個(gè)Point類
public class Point {
private float x;
private float y;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}
步驟二:創(chuàng)建自定義估值器:因?yàn)镻oint不是系統(tǒng)估值器所支持的類型认烁,所以需要自定義
public class MyEvaluator implements TypeEvaluator<Point> {
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
//fraction 動(dòng)畫的完成度:受插值器影響
Log.e("TAG","fraction"+"==="+fraction);
float x = 400 * (fraction*1.5f); //坐標(biāo)x = k * t
float y = 400 * (fraction*1.5f) * (fraction*1.5f); //坐標(biāo)x = k * t *t
//根據(jù)新生成的坐標(biāo)創(chuàng)建Point類并返回
Point point = new Point(x,y);
return point;
}
}
步驟三:為所需要的控件添加動(dòng)畫
@Override
public void onClick(View v) {
//該寫法會(huì)報(bào)錯(cuò): java.lang.ClassCastException: java.lang.Float cannot be cast to com.bing.myparabola.Point
//因?yàn)镺bjectAnimator會(huì)自動(dòng)賦值,而settranslationX()是Float類型的介汹,所以只能使用ValueAnimator
/*ObjectAnimator animator = ObjectAnimator.ofObject(button,"translationX",new MyEvaluator(),new Point(0,0));
animator.setDuration(1500);
animator.start();*/
ValueAnimator animator = ValueAnimator.ofObject(new MyEvaluator(),new Point(0,0),new Point(1,1));
//設(shè)置動(dòng)畫運(yùn)行時(shí)間為1.5s
animator.setDuration(1500);
//動(dòng)畫屬性更新監(jiān)聽(tīng)器
//即:值每更新一次却嗡,變化一次,該方法被調(diào)用一次嘹承,我們可以通過(guò)該方法窗价,手動(dòng)對(duì)控件的屬性賦值
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point point = (Point) animation.getAnimatedValue();
button.setX(point.getX());
button.setY(point.getY());
}
});
//開(kāi)始動(dòng)畫
animator.start();
}
效果圖為:
項(xiàng)目地址為:https://github.com/fengxiaobing/MyParabola