使用Activity做底部弹出框

有时候项目需要做从底部弹出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就行


猜你喜欢

转载自blog.csdn.net/qq_35213388/article/details/78576973
今日推荐