DialogFragment
ユーザーがの行をタップしたときを表示していListView
ます。ダイアログの表示をアニメーション化して、行の中央から大きくなるようにします。ランチャーからフォルダーを開くと、同様の効果が見られます。
私が持っていたアイデアの1つは、との組み合わせTranslateAnimation
ですScaleAnimation
。別の方法はありますか?
DialogFragment
ユーザーがの行をタップしたときを表示していListView
ます。ダイアログの表示をアニメーション化して、行の中央から大きくなるようにします。ランチャーからフォルダーを開くと、同様の効果が見られます。
私が持っていたアイデアの1つは、との組み合わせTranslateAnimation
ですScaleAnimation
。別の方法はありますか?
クラス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
幸運を!
このコードをチェックしてください、それは私にとってはうまくいきます
//スライドアップのアニメーション
<?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;
}
DialogFragment には、まさにこの理由でオーバーライドできる public getTheme() メソッドがあります。このソリューションでは、使用するコード行が少なくなります。
public class MyCustomDialogFragment extends DialogFragment{
...
@Override
public int getTheme() {
return R.style.MyThemeWithCustomAnimation;
}
}
ダイアログ フラグメントの onStart 内で装飾ビューを使用する
@Override
public void onStart() {
super.onStart();
final View decorView = getDialog()
.getWindow()
.getDecorView();
decorView.animate().translationY(-100)
.setStartDelay(300)
.setDuration(300)
.start();
}
DialogFragment では、カスタム アニメーションは onCreateDialog と呼ばれます。「DialogAnimation」は、前の回答のカスタム アニメーション スタイルです。
public Dialog onCreateDialog(Bundle savedInstanceState)
{
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
return dialog;
}
Android Developers Training on Zooming a Viewを見たことがありますか? 良い出発点かもしれません。
これを機能させるために拡張するカスタム クラスを作成することをお勧めしますDialogFragment
。
また、Jake WhartonのNineOldAndroids for Honeycomb Animation API 互換性を API レベル 1 までさかのぼって見てください。