最初は、私のアニメーションは全く機能していないと思っていました。なぜなら、新しい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エミュレータ上で設定する必要がある設定オプションのいくつかの種類が通常のフレームレートで行くありますか?
どうやら、これは両方の断片ルートビューで実装する必要がxFractionとyFraction、によって引き起こされる
期間はどのように設定されていますか? – JoxTraex
3000ミリ秒(3秒) –
これはカスタムテストアプリを使用してアニメーション方程式からコードを削除していますか?あなたはそれがコードの問題かアニメーションの問題かを特定するためにそれを分離したいと思っています。アニメーションコードを単純なテストアプリのシナリオに分離することで、これらの条件を分離することができます。 – JoxTraex