私はAを示していますDialogFragment
ユーザーが行をタップしたときListView
。行の中央から成長するようにダイアログの表示をアニメーション化したいと思います。ランチャーからフォルダーを開くと、同様の効果が見られます。
私が持っていたひとつのアイデアは、の組み合わせです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
成長を忘れてアニメーション化することをお勧めします。
幸運を!
setStyle(DialogFragment.STYLE_NORMAL, R.style.MyCustomTheme)
、onCreate(bundle)
See:developer.android.com/reference/android/app/DialogFragment.html
このコードを確認してください、私にとってはうまくいきます
//上にスライドするアニメーション
<?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;
}
}
AppTheme.NoActionBar
、DialogFragmentがデフォルトを使用しているときにMainActivityを使用しているためですAppTheme
。上記の方法は、フラグメントとアクティビティの両方に一貫したテーマを持たせることで私の問題を解決しました。
アニメーション付きのフルスクリーンダイアログを取得するには、次のように記述します...
スタイル:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="actionModeBackground">?attr/colorPrimary</item>
<item name="windowActionModeOverlay">true</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.NoActionBar.FullScreenDialog">
<item name="android:windowAnimationStyle">@style/Animation.WindowSlideUpDown</item>
</style>
<style name="Animation.WindowSlideUpDown" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/slide_up</item>
<item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
res / anim / slide_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:interpolator/accelerate_quad">
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="100%"
android:toYDelta="0%"/>
</set>
res / anim / slide_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="@android:interpolator/accelerate_quad">
<translate
android:duration="@android:integer/config_shortAnimTime"
android:fromYDelta="0%"
android:toYDelta="100%"/>
</set>
Javaコード:
public class MyDialog extends DialogFragment {
@Override
public int getTheme() {
return R.style.AppTheme_NoActionBar_FullScreenDialog;
}
}
private void showDialog() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
Fragment previous = getSupportFragmentManager().findFragmentByTag(MyDialog.class.getName());
if (previous != null) {
fragmentTransaction.remove(previous);
}
fragmentTransaction.addToBackStack(null);
MyDialog dialog = new MyDialog();
dialog.show(fragmentTransaction, MyDialog.class.getName());
}
DialogFragmentでは、カスタムアニメーションはonCreateDialogと呼ばれます。「DialogAnimation」は、以前の回答のカスタムアニメーションスタイルです。
public Dialog onCreateDialog(Bundle savedInstanceState)
{
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
return dialog;
}
ビューのズームに関するAndroidデベロッパートレーニングをご覧になりましたか?良い出発点になるかもしれません。
DialogFragment
これを機能させるために拡張するカスタムクラスを作成する必要があります。
また、Honeycomb Animation APIの互換性について、Jake Whartons NineOldAndroidsを調べて、APIレベル1に戻ってください。
APIで作業する場合は、onCreateDialog内ではなく、DialogFragemnt-> onStart内で行う必要があります。
@Override
public void onStart()
{
if (getDialog() == null)
{
return;
}
getDialog().getWindow().setWindowAnimations(
R.style.DlgAnimation);
super.onStart();
}
値アニメーションにこのコードを追加します
<scale
android:duration="@android:integer/config_longAnimTime"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:toXScale="1.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"/>
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
styles.xmlを呼び出す
<style name="DialogScale">
<item name="android:windowEnterAnimation">@anim/scale_in</item>
<item name="android:windowExitAnimation">@anim/scale_out</item>
</style>
Javaコード:Onclickを設定
public void onClick(View v) {
fab_onclick(R.style.DialogScale, "Scale" ,(Activity) context,getWindow().getDecorView().getRootView());
// Dialogs.fab_onclick(R.style.DialogScale, "Scale");
}
メソッドの設定:
alertDialog.getWindow().getAttributes().windowAnimations = type;