# XDialog **Repository Path**: giteeguguji/XDialog ## Basic Information - **Project Name**: XDialog - **Description**: 简单易用的Dialog封装 - **Primary Language**: Android - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-04-28 - **Last Updated**: 2022-06-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # XDialog [![](https://jitpack.io/v/com.gitee.giteeguguji/XDialog.svg)](https://jitpack.io/#com.gitee.giteeguguji/XDialog) #### 介绍 简单易用的Dialog封装类-XDialog #### 软件架构 基于Dialog进行二次封装 * 修改Dialog的Theme并使Window背景透明 * 自定义ViewGroup填充Dialog的DecoreView,并使该ViewGroup宽高皆MATCH_PARENT * 所有Dialog的布局将会以该ViewGroup作为根布局进行填充渲染 * 自定义XAnimator动画类用于对所有Dialog布局对应的View进行动画效果施加 * 状态栏自动同步Activity所属Window的flag * Dialog创建后不会再重新创建直至Activity destroy,Dialog状态将得以保留 * 监听Activity的生命周期,Activirty销毁时(onDestroy)自动dismiss #### 引用 Add it in your root build.gradle at the end of repositories: ``` allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` Step 2. Add the dependency ``` dependencies { implementation 'com.gitee.giteeguguji:XDialog:v1.3' } ``` #### 使用 这里以内置的XConfirmDialog为例 1. 编写layout布局文件 ```xml ``` 2. 自定义Dialog类 ```java public class XConfirmDialog extends XCoreDialog { private String text; private TextView textView; /** * 使用该默认构造方法将自动使用默认的Scale动画 * @param context activity */ public XConfirmDialog(@NonNull Context context) { super(context); } /** * 使用该构造方法可传入自定义的XAnimator * @param context activity * @param xAnimator 自定义动画 */ public XConfirmDialog(@NonNull Context context, XAnimator xAnimator) { super(context, xAnimator); } /** * 传递布局文件 */ @Override protected int getImplLayoutResId() { return R.layout.dialog_simple; } /** * 初始化View的内容 */ @Override protected void initDialogContent() { findViewById(R.id.tvConfirm).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); textView = findViewById(R.id.textView); textView.setText(text); } public void setText(String text) { this.text = text; if (textView != null) { textView.setText(text); } } } ``` 3. 使用自定义Dialog ```java private void showSimpleConfirmDialog() { XConfirmDialog xConfirmDialog = new XConfirmDialog(MainActivity.this); xConfirmDialog.setText("简易的确认Dialog"); xConfirmDialog.show(); } ``` 4. 自定义动画 这里以内部默认的缩放动画为例 ```java /** * 缩放动画 */ public class XAnimatorScale extends XAnimator { /** * 动画未开始时DialogView的初始状态 */ @Override public void initAnim() { //getView()获取到Dialog布局对应的View //将目标DialogView缩放设置为0 getView().setScaleX(0); getView().setScaleY(0); } @Override public void animShow() { //将目标DialogView的缩放级别过度到1 getView().animate().scaleX(1f).scaleY(1f).setDuration(ANIM_DURATION).start(); } @Override public void animShowing() { //DialogView完全可见时可在这里继续施加动画 //需要自己手动调用 //eg. XAnimatorScale xAnimatorScale=new XAnimatorScale(); // xAnimatorScale.animShowing() } @Override public void animDismiss() { getView().animate().scaleX(0f).scaleY(0f).setDuration(ANIM_DURATION).start(); } } ``` ```java //使用缩放动画 XConfirmDialog xConfirmDialog = new XConfirmDialog(MainActivity.this,new XAnimatorScale()); xConfirmDialog.setText("简易的确认Dialog"); xConfirmDialog.show(); ``` 5. 设置背景色 背景色默认为有透明度的灰色阴影,若需要需改,可在自定义的Dialog类中复写以下方法: ```java @Override public int getBackgroundColor() { return Color.TRANSPARENT; } ``` 6. 事件监听 监听Dialog的生命周期,复写以下方法: ```java @Override public XDialogLifeCallBack getXDialogCallBack() { return new XDialogLifeCallbackImpl(){ @Override public void onCreateInstance(XCoreDialog XCoreDialog) { super.onCreateInstance(XCoreDialog); //Dialog类实例化完成 } @Override public void onCreate() { super.onCreate(); //Dialog创建完成,创建完成后不会再次创建直至onDesteroy } @Override public void onContentReady(View dialogView) { super.onContentReady(dialogView); //DialogView已创建并添加进Dialog中 //此处不能进行宽高获取等操作,若有需要请复写onDialogViewCreated(); } @Override public void onAnimatorBindDialogView(XAnimator xAnimator) { super.onAnimatorBindDialogView(xAnimator); //自定义动画类已经绑定了DialogView但还未调用initAnim() } @Override public void onAnimInitialized(XAnimator xAnimator) { super.onAnimInitialized(xAnimator); //动画完全初始化 } @Override public void onShow() { super.onShow(); //Dialog显示动画播放完毕,Dialog完全显示 } @Override public void onDestroy() { super.onDestroy(); //Dialog销毁,再次使用会重新onCreate() } @Override public void onDismiss() { super.onDismiss(); //Dialog隐藏动画播放完毕,Dialog完全隐藏 } @Override public void onTouchOutside(MotionEvent ev) { super.onTouchOutside(ev); //触摸了Dialog外部区域 } }; } ``` 7. 点击外部区域是否dismiss,调用原Dialog的方法即可 ```java simpleDialog.setCanceledOnTouchOutside(false); ``` 8. 事件分发 * 对Dialog的根布局Layout进行事件处理可以复写以下方法 ```java /** * 重写该方法进行事件拦截,拦截后会进入onContainerTouchEvent * 外部拦截时请注意不要拦截down,up事件,否则子View将收不到任何点击事件 */ @Override public boolean onContainerInterceptTouchEvent(@NonNull MotionEvent ev) { boolean isIntercept = false; switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: isIntercept = false; break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: isIntercept = false; break; } return isIntercept; } /** * 重写该方法进行触摸事件处理 * @return false-进入onTouchEvent true-消费事件 */ @Override public boolean onContainerTouchEvent(@NonNull MotionEvent ev) { return super.onContainerTouchEvent(ev); } @Override public boolean onTouchEvent(@NonNull MotionEvent event) { return super.onTouchEvent(event); } ``` * 事件穿透 如果需要在点击Dialog外部区域时底层的界面能够响应触摸事件,则做如下处理: ```java @Override public boolean onTouchEvent(@NonNull MotionEvent event) { ((Activity) getRealContext()).dispatchTouchEvent(event); return false; } ``` #### 内置快速使用Dialog 1. XConfirmDialog ```java /** * 简易Dialog带确认按钮 */ private void showSimpleConfirmDialog() { XConfirmDialog xConfirmDialog = new XConfirmDialog(this) .setItemChildClickListener(new XItemChildClickListener() { @Override public void onChildClick(View view) { } }) .setText("简易的确认Dialog"); xConfirmDialog.show(); } ``` 2. XLoadingDialog ```java /** * 自带LoadingView的XLoadingDialog */ private void showLoadingDialog() { XLoadingDialog loadingDialog = new XLoadingDialog(this); loadingDialog.show(); loadingDialog.delayDismissAndRun(3000, new Runnable() { @Override public void run() { //do something... } }); } ``` 3. XSideDialog ```java /** * 侧边菜单(左侧示例) */ private void showLeftSideDialog() { //也可自定义类继承XSideDialog XSideDialog xSideDialog = new XSideDialog(this, XSideAnimator.Orientation.LEFT) { @Override protected int getImplLayoutResId() { return R.layout.dialog_side_left; } @Override protected void initDialogContent() { } }; Rect rect = new Rect(); //左侧Dialog仅left有效 rect.left = 0; //设置边界距离(左边界示例) xSideDialog.setMargin(rect); xSideDialog.show(); } ``` 4. XAttachDialog ```java /* * 依附于View的Dialog * 可从左上右下弹出 * 支持上、下、左、右、居中五种对齐方式 */ public class MyXAttachDialog extends XAttachDialog { private String text; private TextView textView; public MyXAttachDialog(@NonNull Context context) { super(context); } @Override protected void initDialogContent() { textView = findViewById(R.id.textView); textView.setText(text); } @Override protected int getImplLayoutResId() { return R.layout.dialog_attach; } public void setText(String text) { this.text = text; if (textView != null) textView.setText(text); } /** * dialog与依附的View之间的间隔 * * @return dp */ @Override protected int getExtra() { return 10; } } ``` ```java /** * 依附于View的Dialog * XAttachDialogX.Direction - 指明Dialog位于View的上下左右方位 * XAttachDialogX.Align - 表明对齐方式,TOP/BOTTOM(上/下边界对齐只对左右位置生效),LEFT/RIGHT(左/右边界对齐只对上下位置生效),CENTER(居中) */ private void showAttachDialog() { MyXAttachDialogX attachDialog = new MyXAttachDialogX(this); attachDialog.setText("XAttachDialogX(PopupView功能)"); attachDialog.attach(findViewById(R.id.tvAttach), attachDirection, attachAlign); attachDialog.show(); } ``` 5. XPositionDialog ```java /** * 自由定位Dialog(也可自定义类继承PositionDialog) * * @param x dialog中心X坐标 * @param y dialog中心y坐标 */ private void showPositionDialog(int x, int y) { XPositionDialog XPositionDialog = new XPositionDialog(this) { @Override protected int getImplLayoutResId() { return R.layout.dialog_simple; } @Override protected void initDialogContent() { TextView textView = findViewById(R.id.textView); textView.setText("任意位置Dialog"); findViewById(R.id.tvConfirm).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); } }; XPositionDialog.setPosition(x, y); XPositionDialog.show(); } ``` 6. XPartShadowDialog ```java private XPartShadowDialog partShadowDialog; /** * 局部阴影(阴影位于Dialog下方) */ private void showPartBackDialog() { if (partShadowDialog == null) { partShadowDialog = new XPartShadowDialog(this) { @Override protected int getImplLayoutResId() { return R.layout.dialog_part_shadow; } @Override protected void initDialogContent() { } }; //设置依附的View、Dialog基于该View的位置及对齐方式 partShadowDialog.attach(attachView, XAttachDialog.Direction.BOTTOM, XAttachDialog.Align.CENTER); } partShadowDialog.show(); } ``` 7. XMessage ```java private XMessage xMessage; /** * XMessage(不可完全替代Toast) * 使用不同的makeText()可以自定义动画、控制显示的位置 * 默认情况下只能在同一Activity显示 * 如果需要像Toast一样跨Activity显示则需要自行申请悬浮窗权限 */ private void showMsgDialog(String msg) { if (xMessage != null) { xMessage.cancel(); } xMessage = XMessage.makeText(this, msg, XMessage.Duration.LENGTH_SHORT); xMessage.show(); } ``` ```java /** * 任意位置吐司Dialog */ private void showRandomMsgDialog(int left, int top) { XMessage.makeText(this, "任意位置吐司", XMessage.Duration.LENGTH_SHORT, left, top).show(); } ```