这篇文章会持续更新,在学过过程中所有关于Dialog的知识都会记录在文章中
自定义Dialog
- 首先编写一个类,以及一个布局文件
public class MobileSafeDialog extends Dialog {
public MobileSafeDialog(Context context) {
super(context);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = View.inflate(Util.getContext(), R.layout.dialog_layout, null);
setContentView(view);
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.BOTTOM; //底部对齐
window.setAttributes(params);
}
}
----------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F48F78"
android:textColor="#000000"
android:padding="8dp"
android:text="设置标题" />
<ListView
android:layout_width="match_parent"
android:layout_height="200dp"
android:divider="@android:color/darker_gray"
android:dividerHeight="2dp">
</ListView>
</LinearLayout>
这个效果实在是太差了,我们继续改进
- 修改Dialog的样式
我们找到系统定义的Dialog样式 Theme.Light -> Theme.Dialog.NoFrame
我们将这段样式文件拷贝到项目中的styles文件中,用来自定义Dialog的样式,然后再Dialog中引用这个样式
这样我们就引用了自己定义的样式,我们再来慢慢修改这个样式,让Dialog展现成我们想要的效果(有的人可能会疑惑,为什么系统有了我们还要定义呢,原因就是系统的样式我们是无法直接使用的,所以需要我们来自定义样式)
再来看下效果
大家可以结合这张图,来尝试改变上面属性的值,然后根据自己想要的效果来更改属性文件
最后如果想要宽度填充父窗口,看下面这段代码
public class MobileSafeDialog extends Dialog {
public MobileSafeDialog(Context context) {
super(context,R.style.MobileSafeDialogStyle);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = View.inflate(Util.getContext(), R.layout.dialog_layout, null);
setContentView(view);
Window window = getWindow();
WindowManager m = window.getWindowManager();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.BOTTOM;
params.width = m.getDefaultDisplay().getWidth(); //宽度为window的宽度
window.setAttributes(params);
}
}
最后一点定义Dialog的进入退出动画,Theme.Dialog -> windowAnimationStyle -> @style/Animation.Dialog
<item name="windowEnterAnimation">@anim/dialog_enter</item>
<item name="windowExitAnimation">@anim/dialog_exit</item>
后面发现是通过这两个属性来设置进入退出动画的,那么想要进入退出动画就很简单的啦
<style name="MobileSafeDialogAnim">
<item name="android:windowEnterAnimation">@anim/dialog_enter</item>
<item name="android:windowExitAnimation">@anim/dialog_exit</item>
</style>
----------
//进入动画代码
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
>
<translate android:fromYDelta="100%" android:toYDelta="0"/>
</set>
//退出动画代码
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500">
<translate
android:fromYDelta="0"
android:toYDelta="100%" />
</set>
再将这个属性在自定义属性windowAnimationStyle中引用就行了
效果
<style name="NotificationStyle" parent="android:Theme.Dialog">
<!-- 去除背景黑色边框 -->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:textColor">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:layout_width">match_parent</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:backgroundDimEnabled">false</item>
<!-- 进入退出动画 -->
<item name="android:windowAnimationStyle">@style/DialogAnim</item>
<item name="android:windowCloseOnTouchOutside">false</item>
</style>
<style name="DialogAnim">
<item name="android:windowEnterAnimation">@anim/enter_anim</item>
<item name="android:windowExitAnimation">@anim/exit_anim</item>
</style>
ProgressDialog
ProgressDialog dialog = new ProgressDialog(this);//这里需要注意的是使用的上下文必须是Activity,简单的来理解就是Dialog需要显示在Activity上。
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置进度条样式
dialog.setCancelable(false);//设置进度条是否可以消失
dialog.show();//显示对话框
dialog.dismiss();//隐藏对话框