Android開發 - 圖形化生成的貝塞爾插值器


基於三次方貝塞爾曲線的插值器

在動畫開發過程中,經常需要使用到插值器來滿足我們的動畫設計需求。然而,官方提供的插值器並不能滿足所有的需求,所以我們需要自定義插值器。
下面介紹的三次方貝塞爾曲線的插值器,主要可用於實現連續曲線的動畫。
關於貝塞爾曲線的介紹,請移步百度

繪制滿足設計的動畫曲線

1.先使用貝塞爾曲線數值生成工具來獲取想要的曲線數值

工具網站:cubic-bezier.com

使用教程:

  1. 拉拽左邊圖像的2個點,調整出符合效果的圖形
  2. 點擊右上角的Save按鈕,將4個參數運用到下面的代碼中。

2.代碼運用


    new EaseCubicInterpolator(0.31f, 0.85f,0.77f, 0.14f);

如上直接調用下面的差值器類,構造方法中的4個參數,即是從第一步的網站獲得的數值。


/**

 * 緩動三次方曲線插值器.(基於三次方貝塞爾曲線)

 */

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



	/**

	 * 設置中間兩個控制點.<br>

	 * 在線工具: http://cubic-bezier.com/<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;

	}



	/**

	 * 求三次貝塞爾曲線(四個控制點)一個點某個維度的值.<br>

	 * 參考資料: <em> http://devmag.org.za/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;

	}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM