Android-底部弹出的dialog

比如,修改QQ头像时

弹窗的样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="#fff"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:text="拍摄"
android:layout_width="match_parent"
android:layout_height="48dp"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#000000"
android:gravity="center"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"/>
<TextView
android:text="相册选择"
android:layout_width="match_parent"
android:layout_height="48dp"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#000000"
android:gravity="center"/>
<View
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@android:color/darker_gray"/>
<TextView
android:text="取消"
android:layout_width="match_parent"
android:layout_height="48dp"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#000000"
android:gravity="center"/>
</LinearLayout>

进入动画和退出动画

    进入动画

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0"
android:fromYDelta="1000"
android:toXDelta="0"
android:toYDelta="0"/>
</set>

    推出动画

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0"
android:fromYDelta="0"
android:toYDelta="1000"
android:toXDelta="0"/>
</set>

样式和动画

    在styles.xml中定义dialog的样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--  dialog的样式,继承自@andorid:style/Theme.Dialog  -->
<style name="DialogStyle" parent="@android:style/Theme.Dialog">
<!-- 半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 悬浮在Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 背景颜色 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 遮罩层 -->
<item name="android:backgroundDimAmount">0.5</item>
<!-- 模糊 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 边框 -->
<item name="android:windowFrame">@null</item>
</style>

    上边这是抄的别人的,其实我觉得没这么麻烦,可能是因为我的sdk版本不同吧,在我的@andorid:style/Theme.Dialog父样式中,有几个属性是自然存在的,所以不需要再次申明
    甚至只存在一个“背景颜色”,显示依然正常

1
2
3
4
5
6
7
8
9
<!--  dialog的样式,继承自@andorid:style/Theme.Dialog  -->
<style name="DialogStyle" parent="@android:style/Theme.Dialog">
<!-- 半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 背景颜色 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 遮罩层 -->
<item name="android:backgroundDimAmount">0.5</item>
</style>

    添加进入动画和退出动画

1
2
3
4
5
<!--  dialog的动画  -->
<style name="dialog_anim">
<item name="android:windowEnterAnimation">@anim/dialog_in</item>
<item name="android:windowExitAnimation">@anim/dialog_out</item>
</style>

调用弹窗显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public void showDialog(View view) {
// 实例化dialog,传入content和弹窗样式
Dialog dialog = new Dialog(this,R.style.DialogStyle);
// 获取到dialog的布局文件
View view1 = View.inflate(this,R.layout.dialog,null);
dialog.setContentView(view1);//设置布局

Window window = dialog.getWindow();//获取window
window.setGravity(Gravity.BOTTOM);//显示在底部
window.setWindowAnimations(R.style.dialog_anim);//设置动画
// 设置宽高
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
dialog.show();//显示弹窗
// dialog.dismiss();//关闭弹窗
}

    效果