Dialog功能的Activity
请遵守行规!
做项目时需要启动一个另一个进程,但是 这个进程的activity需要以弹窗的方式呈现,然后在activity中执行一些操作,经过查阅资料和自己研究终于实现了,这里记录下方便以后使用,欢迎补充
1.修改activity的背景透明度
在activity的them:style/AppTheme中的resource中加color属性,修改这个item中的值可以达到自己想要的透明度
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 设置透明度为56%(9/16)左右 -->
<color name="transparent">#9000</color>
</resources>
还可以这样:(要设置为没有actionBar)
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@color/transparent</item>
<!-- 设置底层可见 -->
<item name="android:windowIsTranslucent">true</item>
</style>
2.设置activity的切换动画
设置完背景之后需要设置activity切换动画,不然就不是dialog的效果了,因为dialog是直接弹出来的,activity有个默认的切换画面,在刚才的style里加一条item属性
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowAnimationStyle">@null</item>
</style>
有时候也许会因为需求的不同要求弹出无动画,退出有动画等各种需求,这样就需要我们自己组合切换动画,然后在这条item中引用这个动画,下面是切换的几种动画
<style name="FeelyouWindowAnimTheme" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@null</item>
<item name="android:activityOpenExitAnimation">@null</item>
<item name="android:activityCloseEnterAnimation">@null</item>
<item name="android:activityCloseExitAnimation">@null</item>
</style>
注意需要继承自 @android:style/Animation.Activity。具体这4个属性什么意思呢?假设我们有 2 个 Activity,分别是 A1 和 A2:
当我们从 A1 启动 A2 时,A1 从屏幕上消失,这个动画叫做 android:activityOpenExitAnimation
当我们从 A1 启动 A2 时,A2 出现在屏幕上,这个动画叫做 android:activityOpenEnterAnimation
当我们从 A2 退出回到 A1 时,A2 从屏幕上消失,这个叫做 android:activityCloseExitAnimation
当我们从 A2 退出回到 A1 时,A1 出现在屏幕上,这个叫做 android:activityCloseEnterAnimation
3.设置Activity的大小和位置
在代码中设置activity的大小和位置,以达到dialog效果
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay(); // 为获取屏幕宽、高
WindowManager.LayoutParams p = getWindow().getAttributes(); // 获取对话框当前的参值
p.height = (int) (d.getHeight() * 0.5); // 高度设置为屏幕的1.0
p.width = (int) (d.getWidth() * 0.5); // 宽度设置为屏幕的0.8
p.alpha = 1.0f; // 设置本身透明度
p.dimAmount = 0.0f; // 设置黑暗度
getWindow().setAttributes(p); // 设置生效
getWindow().setGravity(Gravity.RIGHT); // 设置靠右对齐
大小可以通过p.height和p.width随意设置,位置可以通过setGravity设置为屏幕的左上右下中其中的某一个位置
这样虽然看起来像是一个dialog,但是实际使用中并不是太好用,有各种小问题,所以我在用时投机取巧了一下,我把这个需要实现dialog效果的activity设置为全屏且无actionBar,然后将背景设置为透明,然后在这个activity中定义一个view,这样的话这个view想要什么样子就可以是什么样子,而且位置、大小等可以随意定义,把你需要展示和操作的放到这个view中,最后给这个activity的根布局设置一个点击事件,让点击之后执行最小化或者退出
TestMainActivity.this.moveTaskToBack(true);//最小化
TestMainActivity.this.finish();//退出
这样就可以达到dialog的效果了,而且比dialog还灵活(个人见解);