MDialog

Android的各个版本中,Dialog的样式大不相同,同时,由于Android版本分裂,大部分用户在低版本上看到的原生样式的Dialog总是和App的主题格格不入。因此,开发者一般都会编写自定义样式的Dialog。

Material Design随Android 5.0发布以来,按照MD标准开发的App也随之增多,Android官方也放出了support包对低版本进行兼容。但是,support包中的Dialog样式仍然有所欠缺,并且定制度也不高,MDialog就应运而生了。先看一张对比的图:

compare

上图中左中右分别为MDialog,原生Dialog,Support包中的Dialog的效果。

Github地址:https://github.com/kyleduo/MDialog

Demo地址:Demo

MDialog

MDialog主要支持AlertDialog样式。提供了MaterialDesign默认样式,尺寸、颜色、效果甚至都好过support包。Demo中,可以发现如下细节:

  1. PrimaryButton的颜色。期望用户选择的按钮,默认为accentColor的颜色,可以方便地适应Material Design标准的App。
  2. 阴影。support包中的适配Dialog并不支持阴影效果,在5.0以下版本的Android系统中显得单薄,没有诚意。MDialog包含优秀的阴影效果(其实是图片实现的,我会告诉你么~);并且,如果设置setCanceledOnTouchOutside();为true,MDialog会有和原生Dialog的行为,content以外的部分收到down事件时即dismiss Dialog。这也是support没有做好的地方,content周围一圈儿范围,是不支持这个行为的。
  3. 配色和间距。MDialog中的配色和间距取自Google提供的Material Design开发规范,相对于后两者,更加自然并突出主要内容。想起一句话“漂亮的不像实力派”,哈哈。

接口

使用MDialog和使用原生Dialog的方式极其类似,通过Builder创建Dialog实例,再通过show()方法展示,同时,因为MDialog继承自Dialog,也支持Dialog提供的各种接口。一个简单的Dialog实例如下:

new MDialog.Builder(this).setTitle(“Demo”).setMessage(“Message of MDialog.\nThis a easy-use library.”)
.setPositiveButton(“OK”, null)
.setNegativeButton(“Cancel”, null)
.create()
.show();

简单明了。

关于按钮,MDialog支持三个按钮,positive、negative、other;这三个按钮从右到左排列,other按钮只在其他两个至少显示一个时才会显示。默认情况下,点击任何一个按钮会自动dismiss掉Dialog,可以通过下面两个接口对这个行为进行控制:

setAutoDismiss(boolean); 设置所有按钮的行为;

setAutoDismiss(boolean, boolean, boolean);

分别设置三个按钮的行为。

Customization

灵活的自定义方式是对第三方库的普遍要求,MDialog虽然默认按照MD标准开发,但也是支持丰富的自定义功能的。

首先,在MD标准下,支持修改按钮的颜色和样式。

setNormalButtonBackgroundRes(int); // background resource id for negative and other button
setPrimaryButtonBackgroundRes(int); // background resource id for positive button
setNormalButtonTextColor(int); // text color for negative and other button
setPrimaryButtonTextColor(int); // text color for positive button

otherButton跟随negativeButton的样式,用xxxNormalXxx方法设置。

其次,对于有自己风格的App,MDialog提供了便捷的方法来对其完全自定义,只需两个步骤

  1. 使用MDialogButton提供的ids设计Dialog的布局。
  2. 使用new MDialog.Builder(this, R.layout.layout_dialog) 构造方法创建Builder。
    其他配置和默认Dialog一致。Demo中包含了两种自定义级别的参考,有图有真相:

custom

左侧只自定义按钮样式,右侧则为完全自定义的样式。

总结

自定义Dialog是我在每个App里面都要做的工作,也因此发现这些通用的代码是可以剥离出来复用的,MDialog降低了遵循MD标准的成本,同时也提供了更加便捷的自定义方式,希望能帮助更多人简化工作,哪怕只有一点点。^-^