显示animation从一个点开始增长的对话框片段

当用户点击ListView的一行时,我显示一个DialogFragment 。 我想animation显示的对话框,使其从行的中心增长。 从启动器打开文件夹时可以看到类似的效果。

我有一个想法是TranslateAnimationScaleAnimation的组合。 有另一种方法吗?

DialogFragment作为Dialog类的包装,你应该设置一个主题到你的基础Dialog来获得你想要的animation:

 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(); } } 

那么你只需要定义包含你想要的animation的主题。 在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> 

现在将这些animation文件添加到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> 

最后,棘手的事情是让你的animation从每一行的中心增长。 我想这行是水平填充屏幕,一方面android:pivotX值将是静态的。 另一方面,您不能以编程方式修改android:pivotY值。

我build议的是,你定义了几个animation,每个animation在android:pivotY属性(和几个引用这些animation的主题)上有不同的百分比值。 然后,当用户点击该行时,计算屏幕上该行的Y位置百分比。 知道百分比的位置,为您的对话框分配一个具有适当的android:pivotY值的主题。

这不是一个完美的解决scheme,但可以为你做的伎俩。 如果你不喜欢这个结果,那么我build议你忘记DialogFragment ,然后用一个简单的View来生成一个从行的确切中心生成的View

祝你好运!

看看这个代码,它适用于我

//向上滑动animation

 <?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> 

//幻灯片animation

 <?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有一个公共的getTheme()方法,你可以骑在这个确切的原因。 该解决scheme使用较less的代码行:

 public class MyCustomDialogFragment extends DialogFragment{ ... @Override public int getTheme() { return R.style.MyThemeWithCustomAnimation; } } 

在DialogFragment中,自定义animation被称为onCreateDialog。 “对话animation”是以前答案中的自定义animation风格。

 public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog dialog = super.onCreateDialog(savedInstanceState); dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; return dialog; } 

你有没有看过Android开发人员放大视图的培训? 可能是一个很好的起点。

你可能想创build一个扩展DialogFragment的自定义类来获得这个工作。

此外,请查看Jake Whartons NineOldAndroids的Honeycomb Animation API兼容性,一直回到API Level 1。

在对话框片段中使用onStart中的装饰视图

 @Override public void onStart() { super.onStart(); final View decorView = getDialog() .getWindow() .getDecorView(); decorView.animate().translationY(-100) .setStartDelay(300) .setDuration(300) .start(); } 

要获得animation的全屏对话框,请写下以下内容…

样式:

 <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 /animation/ 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 /animation/ 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()); } 

如果你想在API上工作,你必须在你的DialogFragemnt-> onStart里面,而不是在onCreateDialog

 @Override public void onStart() { if (getDialog() == null) { return; } getDialog().getWindow().setWindowAnimations( R.style.DlgAnimation); super.onStart(); }