2

最初は、私のアニメーションは全く機能していないと思っていました。なぜなら、新しいFragment ViewGroupは1つのフレーム内の画面に表示されるだけだったからです。それから私はアニメーションを遅くして3秒(3000ミリ秒)かかり、それがちょうど1つのフレームで起こったような大きなチャンクで起こっていることを発見しました。私はそれを3秒に増やしたとき、毎秒約4コマの画像が得られましたが、これはかなり悪いことです。私はGenymotion Emulatorで走っています。エミュレータは、一般的に、設定アプリをクリックすると非常に高速に見えます。Android objectAnimatorのアニメーションが本当に遅い

私はこのアプリで開発を始めているだけなので、何もしていません。それは今のところほとんどシェルであり、私は画面上に新しいFragmentをアニメーション化しようとしています。

新しいのViewGroupには、このプロパティを提供しSlideableLayoutと呼ばれるカスタムクラス、次のとおりです。

public float getXFraction() { 
    final int width = getWidth(); 
    if (width != 0) { 
     return getX()/getWidth(); 
    } else { 
     return getX(); 
    } 
} 

public void setXFraction(float xFraction) { 
    Log.d("SL", "setting xFraction="+xFraction); 
    final int width = getWidth(); 
    if (width > 0) { 
     setX(xFraction * width); 
    } else { 
     setX(-10000); 
    } 
} 

その後、私はそうのようなフラグメントを追加します。

getFragmentManager() 
    .beginTransaction() 
    .setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_to_the_left, 
      R.animator.slide_in_from_the_left, R.animator.slide_out_to_the_right) 
    .add(R.id.navrootlayout, fragment) 
    .addToBackStack(null) 
    .commit(); 

R.animator.slide_in_from_rightアニメーションは次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <objectAnimator 
     android:interpolator="@interpolator/decelerate_cubic" 
     android:valueFrom="1" 
     android:valueTo="0" 
     android:valueType="floatType" 
     android:propertyName="xFraction" 
     android:duration="@integer/navigation_animation_duration"/> 
</set> 

したがって、システムではxFractionプロパティはから0.0になります。すべてのフレームは、widthが得られ、端数で掛け合わされるので、すばやく計算する必要があります。

なぜこのような低いフレームレートで動作しているのかわかりません。私は物理的なデバイスでそれを試してみました。

EDIT:

私はアニメーションを作るために私のGenymotionエミュレータ上で設定する必要がある設定オプションのいくつかの種類が通常のフレームレートで行くありますか?

enter image description here

enter image description here

どうやら、これは両方の断片ルートビューで実装する必要がxFractionとyFraction、によって引き起こされる

enter image description here

enter image description here

+0

期間はどのように設定されていますか? – JoxTraex

+0

3000ミリ秒(3秒) –

+0

これはカスタムテストアプリを使用してアニメーション方程式からコードを削除していますか?あなたはそれがコードの問題かアニメーションの問題かを特定するためにそれを分離したいと思っています。アニメーションコードを単純なテストアプリのシナリオに分離することで、これらの条件を分離することができます。 – JoxTraex

答えて

0

enter image description here

https://stackoverflow.com/a/25701362/2964379

正直言って、それはちょうど壮大な失敗です。 Googleでは、これら2つの方法を追加するだけで、すべての単一のビューを拡張することを期待していますか?

簡単で恐ろしい解決策は、プロパティをxまたはyに設定して値を画面と同じかそれ以上に設定すると速く動作しますが、値によってはアニメーション。

最高の解決策(https://stackoverflow.com/a/20480676/2964379)は、アニメーターをxまたはyに設定することですが、valueFromvalueToを完全に削除することです。次に、すべてのフラグメントのonCreateAnimator(カスタムフラグメントベースクラス内)をオーバーライドし、AnimatorInflater.loadAnimator(activity, nextAnim)を使用してアニメータセットを取得し、その子にsetFloatValuesを呼び出します。たとえば、nextAnim == R.animator.slide_in_from_rightをチェックしてsetFloatValues(screenWidth, 0)に電話をかけることができます。よく働く!

関連する問題