将Activity作为Dialog形式展现

What

Activity众所周知,不再赘述

Why

当你遇到在一个Dialog样式的popup中进行十分复杂的操作时,普通的Dialog不好实现,而使用DiaglogFragment又会有UI上的不满足性,所以想到把Activity作为Dialog形式展现。比如这样的:

这里写图片描述

How

通常步骤

  1. 声明一个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>
  2. Manifest.xml文件中声明对应的Activitytheme

    <activity android:name="MyDialogActivity"
                android:theme="@style/ActivityDialogStyle"
                />

加入动画

在本文的案例中,自定义了Dialog的动画(当然你可以直接指定为系统默认的Dialog动画)

  1. 指定默认动画

    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
  2. 本文中的自定义动画相关:

    1. 定义动画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>
    2. 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>
    3. 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>

注意点

  1. 设置完以上步骤,当你想用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);
        }
    
        ···
    }
  2. 你会发现系统已经设置好了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);
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值