2

Googleのcompatlibを使用して、2.2以降で実行されているデバイスのアプリ(Target SDK 16、Min SDK 8)でフラグメントを有効にしています。機能的な観点からは、これはすべて正常に実行されますが、を介して設定されたビューアニメーションのパフォーマンスは

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(inTransition, outTransition, popInTransition, popOutTransition);

inTransitionのような単純な翻訳はどこにありますか

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="@integer/animation_duration" />
</set>

outTransitionようなフェードアニメーションです

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="@integer/animation_duration" />
</set>

私のGalaxyS2(4.0.3)では、ひどいものです。つまり、約350ミリ秒続くアニメーションの場合は約 フレームの半分がドロップされます。フェードアウトを無効にすると、パフォーマンスが少し(ただしそれほどではない)向上することに気付きましたが、元のフラグメントがすぐに黒くなるため、もちろんアニメーションの完全な効果は失われます。コードのリリースバージョンも試しましたが、パフォーマンスも向上しませんでした。

私は何が間違っているのですか?フラグメントアニメーションをよりスムーズにするにはどうすればよいですか?

4

1 に答える 1

7

最初にお勧めするのは、マニフェストでハードウェアアクセラレーションを有効にすることです。これは、API 3.0以降を搭載したデバイスでのみ有効になりますが、パフォーマンスが大幅に向上します。API 11(3.0)以降では、ViewLayerTypesを利用することもできます。 アニメーション化するものLAYER_TYPE_HARDWAREを設定してから、完了時LAYER_TYPE_SOFTAREまたはLAYER_TYPE_NONE完了時に設定し直します。

プレハニカムははるかに困難になります。ハードウェアアクセラレーションはまったくありません。チェックしたほうがいいかもしれませんif(api < 11) *use this animation* else *use this animation*。スライドアニメーションはかなりスムーズに機能する傾向があります。アルファアニメーションは、特にビューに多くのレイヤーがある場合、CPUに負担をかけます。逃げることができる一番上の親ビューにアニメーションを適用します(フラグメント全体をアニメーション化しているので、すでに発生しています)。

于 2012-09-25T14:07:49.390 に答える