有时候项目需要做从底部弹出dialog,同时又要对dialog做一些复杂的布局,这时候可能用原生dialog满足不了需求了,此时还可以用Activity充当dialog,这样的话什么复杂布局或操作都不怕了
1.先定义style主题和动画
<!--ActivityDialog底部弹出样式 start-->
<style name="ActivityDialogTheme">
<item name="android:windowBackground">@android:color/transparent</item> <!--设置dialog的背景,此处为系统给定的透明值-->
<item name="android:windowFrame">@null</item> <!--Dialog的windowFrame框为无-->
<item name="android:windowNoTitle">true</item> <!--是否显示标题-->
<item name="android:windowIsFloating">true</item> <!--是否浮现在activity之上-->
<item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
<item name="android:windowContentOverlay">@null</item> <!--是否有覆盖-->
<item name="android:windowAnimationStyle">@style/AnimationActivity</item> <!--设置Activity出现方式-->
<item name="android:backgroundDimEnabled">true</item> <!--背景是否模糊显示-->
</style>
<!--从底部弹出的动画样式-->
<style name="AnimationActivity" mce_bogus="1" parent="@android:style/Animation.Activity">
<!--一个activity创建进入的效果。-->
<item name="android:activityOpenEnterAnimation">@anim/slide_in_bottom</item>
<!--一个activity还没有finish()下退出效果, 比如有俩个activity A与B 首先启动A 然后再启动B 那么A还没有finish() 这时A的退出效果。-->
<item name="android:activityOpenExitAnimation">@anim/slide_out_bottom</item>
<!--表示上一个activity返回进入效果 比如有俩个activity A与B B在最上面,B退出(finish)后 A重新进入的效果。-->
<item name="android:activityCloseEnterAnimation">@anim/slide_in_bottom</item>
<!--表示的是activity finish()之后的效果 比如有俩个activity A与B B退出后会被finish() 那么B的退出效果在这定义。-->
<item name="android:activityCloseExitAnimation">@anim/slide_out_bottom</item>
</style>
<!--关掉Activity转场动画-->
<style name="NoAnimation">
<item name="android:activityOpenEnterAnimation">@null</item>
<item name="android:activityOpenExitAnimation">@null</item>
<item name="android:activityCloseEnterAnimation">@null</item>
<item name="android:activityCloseExitAnimation">@null</item>
<item name="android:taskOpenEnterAnimation">@null</item>
<item name="android:taskOpenExitAnimation">@null</item>
<item name="android:taskCloseEnterAnimation">@null</item>
<item name="android:taskCloseExitAnimation">@null</item>
<item name="android:taskToFrontEnterAnimation">@null</item>
<item name="android:taskToFrontExitAnimation">@null</item>
<item name="android:taskToBackEnterAnimation">@null</item>
<item name="android:taskToBackExitAnimation">@null</item>
</style>
2.动画样式anim
从底部滑进屏幕slide_in_bottom.xml
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0"/>
从底部滑出
屏幕slide_out
_bottom.xml<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0"
android:toYDelta="100%p"/>
3.在清单文件设置Activity的主题
<activity
android:name=".SecondActivity"
android:theme="@style/ActivityDialogTheme"/>
4.解决退出SecondActivity从底部退出动画失效问题
//定义Activity退出动画的成员变量 protected int activityCloseEnterAnimation; protected int activityCloseExitAnimation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[] {android.R.attr.windowAnimationStyle}); int windowAnimationStyleResId = activityStyle.getResourceId(0, 0); activityStyle.recycle(); activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[] {android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation}); activityCloseEnterAnimation = activityStyle.getResourceId(0, 0); activityCloseExitAnimation = activityStyle.getResourceId(1, 0); activityStyle.recycle(); //设置布局在底部 getWindow().setGravity(Gravity.BOTTOM); //设置布局填充满宽度 WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); layoutParams.width= WindowManager.LayoutParams.MATCH_PARENT; getWindow().setAttributes(layoutParams); }
//重写finish方法 @Override public void finish() { super.finish(); //finish时调用退出动画 overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation); }5.使用时直接startActivity就行