4

UIViewAnimationCurveEaseInOutと同等のイージング関数が必要ですが、Appleがそれを関数として公開しているのがわかりません。

ここに掲載されているeaseInOutQuad関数を試しましたが成功しませんでした。その関数の私のObjective-Cバージョンは次のとおりです。

-(float) getEaseInOutValueWithElapsedMillis: (float) t startValue: (float) b endValue: (float) c andTotalMillis: (float) d {
   float   value =0.0f;

   if ((t/=d/2.0f) <1.0f)
      value =c/2.0f*t*t + b;
   else
      value =-c/2.0f * ((--t)*(t-2.0f) - 1.0f) + b;

   debug(@"t=%f b=%f c=%f d=%f value=%f", t, b, c, d, value);
   return value;
}

そして、ログに記録された結果は次のとおりです。

開始値が終了値よりも小さい場合:

t=0.066467 b=110.000000 c=225.000000 d=500.000000 value=110.497017
t=0.133133 b=110.000000 c=225.000000 d=500.000000 value=111.993996
t=0.199799 b=110.000000 c=225.000000 d=500.000000 value=114.490944
...
t=0.999786 b=110.000000 c=225.000000 d=500.000000 value=222.451935
t=0.066452 b=110.000000 c=225.000000 d=500.000000 value=236.954926
t=0.133118 b=110.000000 c=225.000000 d=500.000000 value=250.457932
... (note that value shot right past c)
t=0.866440 b=110.000000 c=225.000000 d=500.000000 value=332.993195
t=0.933105 b=110.000000 c=225.000000 d=500.000000 value=334.496582
t=0.999771 b=110.000000 c=225.000000 d=500.000000 value=335.000000

そして、100%の値はcではなくb+cになります。

開始値が終了値より大きい場合:

t=0.047389 b=225.000000 c=110.000000 d=700.000000 value=225.123520
t=0.095008 b=225.000000 c=110.000000 d=700.000000 value=225.496460
...
t=0.904504 b=225.000000 c=110.000000 d=700.000000 value=334.498413
t=0.952122 b=225.000000 c=110.000000 d=700.000000 value=334.873932
t=0.999740 b=225.000000 c=110.000000 d=700.000000 value=335.000000

この場合も、100%の値はcではなくb+cになります。

おそらく私はコードを壊したのでしょう。適切なイーズインイーズアウトを実現するにはどうすればよいですか?

4

2 に答える 2

2

UIViewAnimationCurveEaseInOut に相当するイージング関数が必要ですが、Apple がそれを関数として公開しているとは思えません。

Apple は、コントロール ポイントを取得するために呼び出すことができるCAMediaTimingFunctionビアを公開しています。コントロール ポイント (0, 0)、(0.42, 0)、(0.58, 1)、(1, 1) を持つ 3 次ベジエであることがわかります。[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]getControlPointAtIndex:values:

これにより、y に沿って 、x に沿っf(n)て の 2 次元グラフとしてプロットされるベジエ関数が得られます。したがって、正しい値を取得するには、場所を解いて値を読み取るだけです。valuetimenx = time

具体的には、この関数では:

f.x(n) = (1-n)^3 * 0 + 3(1-n)^2 * n * 0.42 + 3(1-n) * n^2 * 0.58 + n^3 * 1
       = 3(1-n)^2 * n * 0.42 + 3(1-n) * n^2 * 0.58 + n^3
       = 1.26(1 - 2n + n^2) * n + 1.74 (1 - n) * n^2 + n^3
       = 1.26n - 2.52n^2 + 1.26n^3 + 1.74n^2 - 1.74n^3 + n^3
       = 1.26n - 0.78n^2 + 0.52n^3

(免責事項:即興で書きましたのでご確認ください)

時間 0.5 での値を取得するには、次の式で n を解きます。

0.5 = 1.26n - 0.78n^2 + 0.52n^3

次に、それを同等の に差し込みf.y(n)ます。立方体を解くための公式がありますが、それに入るには少し複雑なので、(i) ウィキペディアの記事を読んで公式を使用します。または (ii) 二分探索などによって、数値ソルバーを作成します。この特定のキュービックは非常にうまく動作し、毎回 1 つのソリューションしかありません。

于 2014-07-14T00:30:27.097 に答える