import android.graphics.PointF; import android.view.animation.Interpolator;
/**
* 緩動(dòng)三次方曲線插值器.(基于三次方貝塞爾曲線)
*/
public class EaseCubicInterpolator implements Interpolator {
private final static int ACCURACY = 4096;
private int mLastI = 0;
private final PointF mControlPoint1 = new PointF();
private final PointF mControlPoint2 = new PointF();
/**
* 設(shè)置中間兩個(gè)控制點(diǎn).<br>
* 在線工具: http:///<br>
*
* @param x1
* @param y1
* @param x2
* @param y2
*/
public EaseCubicInterpolator(float x1, float y1, float x2, float y2) {
mControlPoint1.x = x1;
mControlPoint1.y = y1;
mControlPoint2.x = x2;
mControlPoint2.y = y2;
}
@Override
public float getInterpolation(float input) {
float t = input;
// 近似求解t的值[0,1]
for (int i = mLastI; i < ACCURACY; i ) {
t = 1.0f * i / ACCURACY;
double x = cubicCurves(t, 0, mControlPoint1.x, mControlPoint2.x, 1);
if (x >= input) {
mLastI = i;
break;
}
}
double value = cubicCurves(t, 0, mControlPoint1.y, mControlPoint2.y, 1);
if (value > 0.999d) {
value = 1;
mLastI = 0;
}
return (float) value;
}
/**
* 求三次貝塞爾曲線(四個(gè)控制點(diǎn))一個(gè)點(diǎn)某個(gè)維度的值.<br>
* 參考資料: <em> http:///2011/04/05/bzier-curves-a-tutorial/ </em>
*
* @param t
* 取值[0, 1]
* @param value0
* @param value1
* @param value2
* @param value3
* @return
*/
public static double cubicCurves(double t, double value0, double value1,
double value2, double value3) {
double value;
double u = 1 - t;
double tt = t * t;
double uu = u * u;
double uuu = uu * u;
double ttt = tt * t;
value = uuu * value0;
value = 3 * uu * t * value1;
value = 3 * u * tt * value2;
value = ttt * value3;
return value;
}
}
基于三次方貝塞爾曲線的插值器在動(dòng)畫(huà)開(kāi)發(fā)過(guò)程中,經(jīng)常需要使用到插值器來(lái)滿足我們的動(dòng)畫(huà)設(shè)計(jì)需求。然而,官方提供的插值器并不能滿足所有的需求,所以我們需要自定義插值器。 下面介紹的三次方貝塞爾曲線的插值器,主要可用于實(shí)現(xiàn)連續(xù)曲線的動(dòng)畫(huà)。 關(guān)于貝塞爾曲線的介紹,請(qǐng)移步百度。 繪制滿足設(shè)計(jì)的動(dòng)畫(huà)曲線1.先使用貝塞爾曲線數(shù)值生成工具來(lái)獲取想要的曲線數(shù)值工具網(wǎng)站: 使用教程: 拉拽左邊圖像的2個(gè)點(diǎn),調(diào)整出符合效果的圖形 點(diǎn)擊右上角的Save按鈕,將4個(gè)參數(shù)運(yùn)用到下面的代碼中。
2.代碼運(yùn)用new EaseCubicInterpolator(0.31f, 0.85f,0.77f, 0.14f); 來(lái)源:https://www./content-4-574601.html
|