# 用建造者模式写一个底部弹出的Dialog
#### 1.Demo如下:
```android
public class BottomSignDialog extends Dialog implements View.OnClickListener {
private String mConfirmStr;
private OnDialogClickListener mOnDialogClickListener;
private SignatureInputView mSignatureInputView;
public BottomSignDialog(@androidx.annotation.NonNull @NotNull Context context) {
super(context, R.style.dialog);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bottom_sign_dialog);
initView();
}
private void initView() {
setCanceledOnTouchOutside(true);
//设置窗体位置以及动画
Window window = getWindow();
if (null != window) {
window.setWindowAnimations(R.style.main_menu_animstyle);
window.setGravity(Gravity.BOTTOM);
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
mSignatureInputView = findViewById(R.id.signature_pad);
findViewById(R.id.tv_clear).setOnClickListener(v -> mSignatureInputView.clear());
findViewById(R.id.tv_refuse).setOnClickListener(this);
TextView confirmTextView = findViewById(R.id.tv_ok);
confirmTextView.setText(mConfirmStr);
confirmTextView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.tv_ok) {
if (!mSignatureInputView.isSignatureInputAvailable()) {
DebugUtil.toast("请签名!");
return;
}
try {
File file = mSignatureInputView.saveSignature();
if (mOnDialogClickListener != null) {
mOnDialogClickListener.onClickConfirm(file);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
dismiss();
}
}
dismiss();
}
public static class Builder {
private final BottomSignDialog mDialog;
public Builder(Context context) {
mDialog = new BottomSignDialog(context);
}
public Builder setConfirmStr(String confirmStr) {
mDialog.setConfirmStr(confirmStr);
return this;
}
public Builder setOnDialogClickListener(OnDialogClickListener onDialogClickListener) {
mDialog.setOnDialogClickListener(onDialogClickListener);
return this;
}
public BottomSignDialog build() {
return mDialog;
}
}
private void setConfirmStr(String confirmStr) {
mConfirmStr = confirmStr;
}
private void setOnDialogClickListener(OnDialogClickListener onDialogClickListener) {
mOnDialogClickListener = onDialogClickListener;
}
public interface OnDialogClickListener {
/**
* 签名生成的文件
*
* @param file file
*/
void onClickConfirm(File file);
}
}
```
### 2.dialog对应的`style`
```
<style name="dialog" parent="@style/Theme.AppCompat.Light.Dialog">
<item name="android:windowFrame">@null</item><!--无边框-->
<item name="android:windowIsFloating">true</item><!--浮动-->
<item name="android:windowNoTitle">true</item><!--无title-->
<item name="android:windowIsTranslucent">true</item><!--界面透明-->
<item name="android:background">@android:color/transparent</item><!--背景透明-->
<item name="android:windowBackground">@android:color/transparent</item><!--窗体背景透明-->
<item name="android:backgroundDimAmount">0.2</item>
</style>
```