使用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就行


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现底部弹出的效果,可以使用一个自定义的布局,将其放在底部,并设置其初始的高度为0。然后通过手动滑动控制其高度的变化,即可控制其开合。 具体的实现方式如下: 1. 定义一个布局文件,作为底部弹出的容器,可以使用 LinearLayout 或者 RelativeLayout 等布局。 2. 在 Java 代码中,获取该布局,设置其初始高度为0,并且将其添加到当前 Activity 的根布局中。 3. 监听手动滑动事件,当手指滑动时,动态地改变底部弹出的高度,从而实现开合的效果。 下面是一个简单的示例代码: ```java // 获取底部弹出的容器 LinearLayout bottomLayout = findViewById(R.id.bottom_layout); // 设置初始高度为0 bottomLayout.getLayoutParams().height = 0; // 将底部弹出添加到根布局中 ViewGroup rootView = getWindow().getDecorView().findViewById(android.R.id.content); rootView.addView(bottomLayout); // 监听手动滑动事件 bottomLayout.setOnTouchListener(new View.OnTouchListener() { private float startY; private float lastY; private int minHeight = 0; private int maxHeight = 500; // 最大高度为500dp,可以根据实际情况调整 @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: startY = motionEvent.getRawY(); lastY = startY; minHeight = view.getHeight(); break; case MotionEvent.ACTION_MOVE: float deltaY = motionEvent.getRawY() - lastY; lastY = motionEvent.getRawY(); int height = (int) (view.getHeight() - deltaY); if (height < minHeight) { height = minHeight; } if (height > maxHeight) { height = maxHeight; } view.getLayoutParams().height = height; view.requestLayout(); break; case MotionEvent.ACTION_UP: break; } return true; } }); ``` 通过以上代码,就可以实现一个简单的底部弹出,并且可以通过手动滑动控制它的开合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值