What
Activity
众所周知,不再赘述
Why
当你遇到在一个Dialog
样式的popup
中进行十分复杂的操作时,普通的Dialog
不好实现,而使用DiaglogFragment
又会有UI上
的不满足性,所以想到把Activity
作为Dialog
形式展现。比如这样的:
How
通常步骤
声明一个style,这个样式定义了Dialog样式
<style name="ActivityDialogStyle" parent="Theme.AppCompat.NoActionBar"> <!--设置dialog的背景--> <item name="android:windowBackground">@android:color/transparent</item> <!--设置Dialog的windowFrame框为无--> <item name="android:windowFrame">@null</item> <!--设置无标题--> <item name="android:windowNoTitle">true</item> <!--是否浮现在activity之上--> <item name="android:windowIsFloating">true</item> <!--是否半透明--> <item name="android:windowIsTranslucent">true</item> <!--设置窗口内容不覆盖--> <item name="android:windowContentOverlay">@null</item> <!--设置动画--> <item name="android:windowAnimationStyle">@style/DialogScaleAnim</item> <!--背景是否模糊显示--> <item name="android:backgroundDimEnabled">true</item> </style>
在
Manifest.xml
文件中声明对应的Activity
的theme
<activity android:name="MyDialogActivity" android:theme="@style/ActivityDialogStyle" />
加入动画
在本文的案例中,自定义了Dialog的动画(当然你可以直接指定为系统默认的Dialog动画)
指定默认动画
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
本文中的自定义动画相关:
定义动画style:
<style name="DialogScaleAnim" parent="@android:style/Animation.Activity"> <item name="android:activityOpenEnterAnimation">@anim/dialog_scale_in</item> <item name="android:activityOpenExitAnimation">@anim/dialog_scale_out</item> <item name="android:activityCloseEnterAnimation">@anim/dialog_scale_in</item> <item name="android:activityCloseExitAnimation">@anim/dialog_scale_out</item> </style>
dialog_scale_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:fromXScale="1.0" android:fromYScale="0.0" android:toXScale="1.0" android:toYScale="1.0" android:pivotX="0" android:pivotY="50%" android:duration="200" android:interpolator="@android:anim/accelerate_decelerate_interpolator" /> </set>
dialog_scale_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:fromXScale="1.0" android:fromYScale="0.0" android:toXScale="1.0" android:toYScale="1.0" android:pivotX="0" android:pivotY="50%" android:duration="200" android:interpolator="@android:anim/accelerate_decelerate_interpolator" /> </set>
注意点
设置完以上步骤,当你想用Dialog形式展现时,直接
startActivity
即可,但是还有一个小问题,那就是你会发现弹出动画没问题,结束动画却不是你定义的动画(除非你定义的动画与系统一致),此时需要在Activity中加入如下代码即可:public class MyDialogActivity extends AppCompatActivity { ··· @Override public void finish() { super.finish(); //在此时设置转场动画 overridePendingTransition(R.anim.dialog_scale_in,R.anim.dialog_scale_out); } ··· }
你会发现系统已经设置好了Dialog的宽度大小,如果你不满足,当然可以自己更改,可以通过在
onCreate
中增加以下代码://设置弹出窗口与屏幕对齐 Window win = this.getWindow(); int density = (int)(getResources().getDisplayMetrics().density + 0.5f); //设置内边距,这里设置为10dp win.getDecorView().setPadding(10 * density, 10 * density, 10 * density, 10 * density); WindowManager.LayoutParams lp = win.getAttributes(); //设置窗口宽度 lp.width = WindowManager.LayoutParams.MATCH_PARENT; //设置窗口高度 lp.height = WindowManager.LayoutParams.WRAP_CONTENT; //设置Dialog位置 lp.gravity = Gravity.TOP; win.setAttributes(lp);