102

DialogFragmentユーザーがの行をタップしたときを表示していListViewます。ダイアログの表示をアニメーション化して、行の中央から大きくなるようにします。ランチャーからフォルダーを開くと、同様の効果が見られます。

私が持っていたアイデアの1つは、との組み合わせTranslateAnimationですScaleAnimation。別の方法はありますか?

4

10 に答える 10

188

クラスDialogFragmentのラッパーであるため、必要なアニメーションを取得するにはDialog、ベースにテーマを設定する必要があります。Dialog

public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    {
        // Set a theme on the dialog builder constructor!
        AlertDialog.Builder builder = 
            new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme );

        builder  
        .setTitle( "Your title" )
        .setMessage( "Your message" )
        .setPositiveButton( "OK" , new DialogInterface.OnClickListener() 
            {      
              @Override
              public void onClick(DialogInterface dialog, int which) {
              dismiss();                  
            }
        });
        return builder.create();
    }
}

次に、必要なアニメーションを含むテーマを定義するだけです。styles.xmlにカスタム テーマを追加します。

<style name="MyCustomTheme" parent="@android:style/Theme.Panel">
    <item name="android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>

<style name="MyAnimation.Window" parent="@android:style/Animation.Activity"> 
    <item name="android:windowEnterAnimation">@anim/anim_in</item>
    <item name="android:windowExitAnimation">@anim/anim_out</item>
</style>    

res/animフォルダーにアニメーション ファイルを追加します。

(android:pivotYが鍵です )

anim_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/linear_interpolator"
        android:fromXScale="0.0"
        android:toXScale="1.0"
        android:fromYScale="0.0"
        android:toYScale="1.0"
        android:fillAfter="false"
        android:startOffset="200"
        android:duration="200" 
        android:pivotX = "50%"
        android:pivotY = "-90%"
    />
    <translate
        android:fromYDelta="50%"
        android:toYDelta="0"
        android:startOffset="200"
        android:duration="200"
    />
</set>

anim_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/linear_interpolator"
        android:fromXScale="1.0"
        android:toXScale="0.0"
        android:fromYScale="1.0"
        android:toYScale="0.0"
        android:fillAfter="false"
        android:duration="200" 
        android:pivotX = "50%"        
        android:pivotY = "-90%"        
    />
    <translate
        android:fromYDelta="0"
        android:toYDelta="50%"
        android:duration="200"
    />
</set>

最後に、ここで注意が必要なのは、アニメーションを各行の中央から成長させることです。行が画面を水平に埋めていると思うので、一方でandroid:pivotX値は静的になります。一方、android:pivotYプログラムで値を変更することはできません。

私が提案するのは、それぞれがandroid:pivotY属性に異なるパーセンテージ値を持ついくつかのアニメーションを定義することです (およびそれらのアニメーションを参照するいくつかのテーマ)。次に、ユーザーが行をタップすると、画面上の行のパーセンテージで Y 位置が計算されます。パーセンテージで位置を把握して、適切なandroid:pivotY値を持つテーマをダイアログに割り当てます。

それは完璧な解決策ではありませんが、あなたのためにトリックを行うことができます. 結果が気に入らない場合は、を忘れて、行の正確な中心から単純な成長DialogFragmentをアニメーション化することをお勧めします。View

幸運を!

于 2012-11-24T00:33:51.797 に答える
138

このコードをチェックしてください、それは私にとってはうまくいきます

//スライドアップのアニメーション

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="100%"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="0" />

</set>

//スライドダウンアニメーション

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="100%p" />

</set>

// スタイル

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

// ダイアログフラグメント内

@Override
public void onActivityCreated(Bundle arg0) {
    super.onActivityCreated(arg0);
    getDialog().getWindow()
    .getAttributes().windowAnimations = R.style.DialogAnimation;
}
于 2013-04-04T16:04:41.020 に答える
30

DialogFragment には、まさにこの理由でオーバーライドできる public getTheme() メソッドがあります。このソリューションでは、使用するコード行が少なくなります。

public class MyCustomDialogFragment extends DialogFragment{
    ...
    @Override
    public int getTheme() {
        return R.style.MyThemeWithCustomAnimation;
    }
}
于 2015-04-10T08:51:24.237 に答える
4

ダイアログ フラグメントの onStart 内で装飾ビューを使用する

@Override
public void onStart() {
    super.onStart();


    final View decorView = getDialog()
            .getWindow()
            .getDecorView();

    decorView.animate().translationY(-100)
            .setStartDelay(300)
            .setDuration(300)
            .start();

}
于 2016-08-25T17:18:26.797 に答える
4

DialogFragment では、カスタム アニメーションは onCreateDialog と呼ばれます。「DialogAnimation」は、前の回答のカスタム アニメーション スタイルです。

public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
    return dialog;
}
于 2013-12-16T07:32:41.600 に答える
1

Android Developers Training on Zooming a Viewを見たことがありますか? 良い出発点かもしれません。

これを機能させるために拡張するカスタム クラスを作成することをお勧めしますDialogFragment

また、Jake WhartonのNineOldAndroids for Honeycomb Animation API 互換性を API レベル 1 までさかのぼって見てください。

于 2012-11-21T20:29:49.147 に答える