274

たとえば、Honeycomb Gmailクライアントが使用するようなスライドをどのように実装する必要がありますか?

フラグメントを追加および削除することでこれを自動的に処理できますTransactionManager。エミュレータがスライドショーであるため、これをテストするのは難しいです:)

4

6 に答える 6

394

フラグメント間の遷移をアニメーション化する、またはフラグメントを表示または非表示にするプロセスをアニメーション化するには、を使用してFragment Managerを作成しFragment Transactionます。

各フラグメントトランザクション内で、表示と非表示にそれぞれ使用されるインアニメーションとアウトアニメーションを指定できます(置換が使用されている場合は両方)。

次のコードは、一方のフラグメントをスライドさせて、もう一方のフラグメントをその場所にスライドさせることにより、フラグメントを置き換える方法を示しています。

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

単に呼び出すft.showft.hide、または非表示にするフラグメントを渡すことで、フラグメントを非表示または表示することで同じことを実現するには、それぞれ表示または非表示にします。

参考までに、XMLアニメーション定義はobjectAnimatorタグを使用します。slide_in_leftの例は、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>
于 2011-01-27T17:24:16.337 に答える
258

サポートライブラリを使用する必要がない場合は、Romanの回答をご覧ください。

ただし、サポートライブラリを使用する場合は、以下で説明する古いアニメーションフレームワークを使用する必要があります。

Retoblindstuffの回答を調べた後、次のコードが機能するようになりました。

後ろを押すと、破片が右からスライドインし、左にスライドして表示されます。

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

順序は重要です。つまり、前に電話する必要があります。そうしないと、アニメーションが有効になりません。setCustomAnimations()replace()

次に、これらのファイルをres/animフォルダー内に配置する必要があります。

enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

exit.xml

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml

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

@android:integer/config_shortAnimTimeアニメーションの長さは、または他の数値のようなデフォルト値のいずれかに変更できます。

フラグメントの置換の間に構成の変更(ローテーションなど)が発生した場合、戻るアクションはアニメーション化されないことに注意してください。これは文書化されたバグであり、サポートライブラリのrev20にまだ存在しています。

于 2013-07-05T12:07:10.593 に答える
27

アニメーションファイルを作成する代わりにこれを使用することを強くお勧めします。これははるかに優れたソリューションだからです。Android Studioには、新しいXMLファイルを作成せずに使用できるデフォルトがすでに用意されています。 animationアニメーションの名前はandroid.R.anim.slide_in_leftandroid.R.anim.slide_out_rightであり、次のように使用できます。

FragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left、android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

出力:

ここに画像の説明を入力してください

于 2017-09-22T05:17:58.870 に答える
5

私が変更したサポートライブラリは、フラグメントトランジションにビューアニメーション(つまり<translate>, <rotate>)とオブジェクトアニメーター(つまり)の両方を使用することをサポートしています。NineOldAndroids<objectAnimator>で実装されています。詳細については、githubの私のドキュメントを参照してください。

于 2014-03-20T01:18:09.900 に答える
2

私に関しては、私はビューの方向性が必要です:

で->右からスワイプ

アウト->左にスワイプ

ここで私のために働くコード:

slide_in_right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="0" android:toXDelta="-50%p"
                android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
                android:duration="@android:integer/config_mediumAnimTime" />
    </set>

トランザクションコード:

inline fun FragmentActivity.setContentFragment(
        containerViewId: Int,
        backStack: Boolean = false,
        isAnimate: Boolean = false,
        f: () -> Fragment

): Fragment? {
    val manager = supportFragmentManager
    return f().apply {
        manager.beginTransaction().let {
            if (isAnimate)
                it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)

            if (backStack) {
                it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
            } else {
                it.replace(containerViewId, this, "Fr").commit()
            }
        }
    }
}
于 2019-03-19T11:08:30.460 に答える
0

私はこれを以下の方法で解決します

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment
于 2015-02-25T09:03:00.157 に答える