NYDialog

作者: 资本家大恶人 | 来源:发表于2021-04-29 17:20 被阅读0次
    /**
     * 当前release 1.0版本
     * 当前dialog支持如下:
     *  底部button支持一到两个,支持横竖向排列,支持热拔插
     *  头部容器支持自定义配置
     *  底部容器支持自定义设置
     *  文本title和文本content支持选择配置
     *  底部按钮支持自定义背景
     *  关闭按钮支持热插拔
     * ----------------------------------
     * beta版本支持如下:
     *  弹窗关闭配置 setCanceledOnTouchOutside
     *  弹窗支持背景多样化处理  纹路
     *  弹窗支持配置标识  标识
     * ----------------------------------
     * beta2版本支持如下:
     *  底部多button(大于两个button)配置
     *  支持button比例分割处理
     *-----------------------------------
     * beta3版本支持如下
     *  支持扩展自定义
     * create by LiYan
     */
    class NYDialog(context: Context, config: AbsHintDialogMainInterface?, view: View?) : Dialog(context, R.style.dialog_translucent) {
    
        init {
            val layout = LayoutInflater.from(context).inflate(R.layout.hint_dialog, null)
            setContentView(view ?: layout)
            config?.init(layout, this, window)
        }
    
        companion object Builder {
            private var config: AbsHintDialogMainInterface? = null//可定制接口
            private var mTitle: String = ""//标题
            private var mContent: String = ""//文案
            private var mConfirmTxt: String = ""//确定按钮文案
            private var mCancelTxt: String = ""//取消按钮文案
            private var mCanceledOnTouchOutside: Boolean = true//是否需要关闭按钮 默认true
            private var confirmListener: () -> Unit = {}//确定监听
            private var cancelListener: () -> Unit = {}//取消监听
            private var mGravity: Int = Gravity.CENTER//Dialog显示的方向
    
            //设置Dialog方向
            private var mPaddingEnd: Int = 20
            private var mPaddingStart: Int = 20
            private var mPaddingTop: Int = 0
            private var mPaddingBottom: Int = 0
    
            //设置Dialog大小
            private var mWidth: Int = WindowManager.LayoutParams.MATCH_PARENT
            private var mHeight: Int = WindowManager.LayoutParams.WRAP_CONTENT
    
            /*
            * 设置自定义方法
            * 默认可以不写
            * */
            fun Builder(config: AbsHintDialogMainInterface): Builder {
                this.config = config
                return this
            }
    
            /*
            *设置Title
            * */
            fun title(title: String?): Builder {
                if (title != null) {
                    this.mTitle = title
                }
                return this
            }
    
            /*
            * 设置内容
            * */
            fun content(content: String?): Builder {
                if (content != null) {
                    this.mContent = content
    
                }
                return this
            }
    
            /*
            * 设置确定按钮文案
            * */
            fun confirmTxt(confirmTxt: String?): Builder {
                if (confirmTxt != null) {
                    this.mConfirmTxt = confirmTxt
    
                }
                return this
            }
    
            /*
            * 设置方向
            * */
            fun setGravity(gravity: Int) {
                mGravity = gravity
            }
    
            /*设置取消按钮文案
            * */
            fun cancelTxt(cancelTxt: String?): Builder {
                if (cancelTxt != null) {
                    this.mCancelTxt = cancelTxt
                }
                return this
            }
    
            /**
             * @param confirmLisenter: () -> Unit  确定按钮方法
             * @param cancelLisenter: () -> Unit   取消按钮方法
             * */
            fun click(confirmLisenter: () -> Unit, cancelLisenter: () -> Unit): Builder {
                this.confirmListener = confirmLisenter
                this.cancelListener = cancelLisenter
                return this
            }
    
            /*
            * 设置是否点击外部可以关闭
            * */
            fun serCancelable(canceledOnTouchOutside: Boolean) {
                this.mCanceledOnTouchOutside = canceledOnTouchOutside
            }
    
            //设置padding
            fun setNYDialogPadding(left: Int, top: Int, right: Int, bottom: Int) {
                mPaddingEnd = right
                mPaddingStart = left
                mPaddingTop = top
                mPaddingBottom = bottom
            }
    
            //设置大小
            fun setNYDialogParams(width: Int, height: Int) {
                mWidth = width
                mHeight = height
            }
    
            /*
            * 创建按钮
            * */
            fun create(context: Context): NYDialog {
    
                config?.apply {
                    inflaterBtnTxt(mConfirmTxt, mCancelTxt)
                    inflaterMainTxt(mTitle, mContent)
                    setConfirmLisenter(confirmListener)
                    setCancelLisenter(cancelListener)
                    setNYDialogPadding(mPaddingStart, mPaddingTop, mPaddingEnd, mPaddingBottom)
                    setNYDialogParams(mWidth, mHeight)
                    setGravity(mGravity)
                    //置空缓存解决弹窗缓存其他弹窗数据
                    mTitle = ""
                    mContent = ""
                    mCancelTxt = ""
                    mConfirmTxt = ""
                    confirmListener = {}
                    confirmListener = {}
                    mPaddingStart = 20
                    mPaddingEnd = 20
                    mPaddingTop = 0
                    mPaddingBottom = 0
                    mWidth = WindowManager.LayoutParams.MATCH_PARENT
                    mHeight = WindowManager.LayoutParams.WRAP_CONTENT
                    mGravity = Gravity.CENTER
                }
                val nyDialog = NYDialog(context, config, null)
                nyDialog.setCanceledOnTouchOutside(mCanceledOnTouchOutside)//点击外部可关闭
                return nyDialog
            }
    
        }
    
        abstract class AbsHintDialogMainInterface : INYDialogMainInterface {
            private var dialogTitle: String = ""
            private var dialogContent: String = ""
            private var dialogConfirmTitle: String = ""
            private var dialogCancelContent: String = ""
            private var confirmLisenter: () -> Unit = {}
            private var cancelLisenter: () -> Unit = {}
    
            //NY接口扩展
            protected var chirldren: (btnOk: View, btnCanCel: View, clContainer: LinearLayout) -> Unit = { view: View, view1: View, linearLayout: LinearLayout -> }
    
            //Dialog显示的方向
            private var mGravity: Int = Gravity.CENTER
    
            //设置底部按钮方向
            private var direct: Int = LinearLayout.VERTICAL
    
            //设置Dialog方向
            private var mPaddingEnd: Int = 0
            private var mPaddingStart: Int = 0
            private var mPaddingTop: Int = 0
            private var mPaddingBottom: Int = 0
    
            //设置Dialog大小
            private var mWidth: Int = 0
            private var mHeight: Int = 0
    
            //初始Dialog
            override fun init(layout: View, nyDialog: NYDialog, window: Window?) {
                window?.let {
                    it.attributes.width = mWidth
                    it.attributes.height = mHeight
                    it.setGravity(Gravity.CENTER)
                    it.decorView.setPadding(mPaddingStart, mPaddingTop, mPaddingEnd, mPaddingBottom)
                    it.attributes.horizontalMargin = 0f
                    it.attributes.verticalMargin = 0f
                }
    
                //clContainer
                val clContainer = layout.findViewById<LinearLayout>(R.id.clContainer)
                /*view填充*/
                //头部View填充
                val headerDesc = layout.findViewById<FrameLayout>(R.id.rl_header_desc)
                //底部View填充
                val bottomDesc = layout.findViewById<FrameLayout>(R.id.rl_bottom_desc)
                /*内容*/
                //Title
                val tvTitle = layout.findViewById<TextView>(R.id.ivVipTitleDes)
                //content
                val tvContent = layout.findViewById<TextView>(R.id.tvVipDayCome)
                /*按钮*/
                //Ok
                val btnOk = layout.findViewById<TextView>(R.id.btnOnline)
                //Cancel
                val btnCancel = layout.findViewById<TextView>(R.id.btn_random)
                // 关闭按钮
                val ivClose = layout.findViewById<ImageView>(R.id.ivClose)
                //bottom
                val bottomBtns = layout.findViewById<LinearLayout>(R.id.ll_bottom_btns)
    
                /*按钮监听*/
                btnOk.setOnClickListener {
                    confirmLisenter()
                    nyDialog.dismiss()
    
                }
                btnCancel.setOnClickListener {
                    cancelLisenter()
                    nyDialog.dismiss()
                }
                ivClose.setOnClickListener {
                    cancelLisenter()
                    nyDialog.dismiss()
                }
    
                /*是否需要关闭按钮*/
                if (needCloseIcon()) {
                    ivClose.visibility = View.VISIBLE
                } else {
                    ivClose.visibility = View.GONE
                }
    
                /*判断是否需要显示按钮*/
                if (provideTitleDesc().isNotEmpty()) tvTitle.text = provideTitleDesc() else tvTitle.visibility = View.GONE
                if (provideContentDesc().isNotEmpty()) tvContent.text = provideContentDesc() else tvContent.visibility = View.GONE
    
                if (provideConfirmDesc().isNotEmpty()) btnOk.text = provideConfirmDesc() else btnOk.visibility = View.GONE
                if (provideCancelDesc().isNotEmpty()) btnCancel.text = provideCancelDesc() else btnCancel.visibility = View.GONE
    
                if (!btnOk.isVisible && !btnCancel.isVisible) {
                    bottomBtns.visibility = View.GONE
                }
                //设置按钮背景
                provideCancelBtnBg()?.let { btnCancel.setBackgroundResource(it) }//取消
                /*自定义按钮*/
                provideConfirmBtnAndCancel(btnOk, btnCancel)
                /*自定义文案*/
                provideTitleAndContent(tvTitle, tvContent)
                //头部添加View
                inflateDialogHeader()?.let {
                    headerDesc.removeAllViews()
                    headerDesc.addView(it)
                }
                //底部添加View
                inflateDialogBottom()?.let {
                    bottomDesc.removeAllViews()
                    bottomDesc.addView(it)
                }
                //按钮方向
                bottomBtns.orientation = provideBottomBtnOrientation()
                chirldren(btnOk, btnCancel, clContainer)
    
            }
    
    
            //设置padding
            fun setNYDialogPadding(left: Int, top: Int, right: Int, bottom: Int) {
                mPaddingEnd = right
                mPaddingStart = left
                mPaddingTop = top
                mPaddingBottom = bottom
            }
    
            //设置大小
            fun setNYDialogParams(width: Int, height: Int) {
                mWidth = width
                mHeight = height
            }
    
            //设置在屏幕中的位置
            fun setGravity(gravity: Int) {
                mGravity = gravity
            }
    
            //Dialog头部 默认为空
            override fun inflateDialogHeader(): View? {
                return null
            }
    
            //添加底部View 默认为空
            override fun inflateDialogBottom(): View? {
                return null
            }
    
            //设置底部按钮方向
            override fun provideBottomBtnOrientation(): Int {
                return direct
            }
    
            //是否需要关闭按钮   方法已过期
            @Deprecated("已移置Build", ReplaceWith("true"))
            override fun needCloseIcon(): Boolean {
                return true
            }
    
            /**
             *@link # provideConfirmBtnAndCancel()
             * 取消背景 方法过期
             * */
            @Deprecated("已移置 provideConfirmBtnAndCancel()", ReplaceWith("null"))
            open fun provideCancelBtnBg(): Int? {
                return null
            }
    
            /*文案*/
            //title
            private fun provideTitleDesc(): String {
                return dialogTitle
            }
    
            //content
            private fun provideContentDesc(): String {
                return dialogContent
            }
    
            //设置title内容
            fun inflaterMainTxt(vararg args: String) {
                if (args.size == 2) {
                    if (args[0].isNotEmpty()) {
                        dialogTitle = args[0]
                    }
                    if (args[1].isNotEmpty()) {
                        dialogContent = args[1]
                    }
                }
            }
    
            //确定按钮
            private fun provideConfirmDesc(): String {
                return dialogConfirmTitle
            }
    
            //取消按钮
            private fun provideCancelDesc(): String {
                return dialogCancelContent
            }
    
            //设置按钮文案
            fun inflaterBtnTxt(vararg args: String) {
                if (args.size == 2) {
                    if (args[0].isNotEmpty()) {
                        dialogConfirmTitle = args[0]
                    }
                    if (args[1].isNotEmpty()) {
                        dialogCancelContent = args[1]
                    }
                }
            }
    
            /*按钮监听*/
            //确定按钮Click
            internal fun setConfirmLisenter(confirmLisenter: () -> Unit) {
                this.confirmLisenter = confirmLisenter
            }
    
            //取消按钮Click
            internal fun setCancelLisenter(cancelLisenter: () -> Unit) {
                this.cancelLisenter = cancelLisenter
            }
            /*自定义样式*/
    
            //自定义按钮样式
            override fun provideConfirmBtnAndCancel(confirm: TextView, cancel: TextView) {
            }
    
            //自定义文案样式
            override fun provideTitleAndContent(title: TextView, content: TextView) {
    
            }
    
        }
    
        /**
         * 主体接口
         */
        private interface INYDialogMainInterface {
            //初始化
            fun init(layout: View, nyDialog: NYDialog, window: Window?)
    
            /**
             * 头部填充
             */
            fun inflateDialogHeader(): View?
    
            /**
             * 底部View填充
             */
            fun inflateDialogBottom(): View?
    
            /**
             * 关闭按钮是否需要
             */
            fun needCloseIcon(): Boolean
    
    
            /**
             * confirm/cancel 按钮设置
             */
            fun provideConfirmBtnAndCancel(confirm: TextView, cancel: TextView)
    
            /*
            * title/content
            * */
            fun provideTitleAndContent(title: TextView, content: TextView)
    
    
            /**
             * 底部按钮排列方向
             */
            fun provideBottomBtnOrientation(): Int
    
    
        }
    
        /**
         * 聚合接口
         */
        private interface INYDialogCompactInterface : INYDialogMainInterface {
            fun cancelBtnBg(): Int
            fun confirmBtnBg(): Int
            fun DialogBg(): Int
        }
    
        /*据和接口实现*/
        abstract class AbsHintDialogCompactInterface : AbsHintDialogMainInterface(), INYDialogCompactInterface {
            private var mCancelBg: Int = R.drawable.common_btn_primary_bg
            private var mConfirmBtnBg: Int = R.drawable.common_btn_primary_bg
            private var mDialogBg: Int = R.drawable.common_dialog_rect_white_bg
    
            //按钮取消背景颜色
            override fun cancelBtnBg(): Int {
                return mCancelBg
            }
    
            //确认按钮背景颜色
            override fun confirmBtnBg(): Int {
                return mConfirmBtnBg
            }
    
            override fun DialogBg(): Int {
                return mDialogBg
            }
    
            init {
                chirldren = { btnOk: View, btnCanCel: View, dialogBg: LinearLayout ->
                    btnOk.setBackgroundResource(mConfirmBtnBg)
                    btnCanCel.setBackgroundResource(mCancelBg)
                    dialogBg.setBackgroundResource(mConfirmBtnBg)
    
                }
            }
    
    
        }
    
        /*定制接口
        * */
    
    
    }
    

    相关文章

      网友评论

          本文标题:NYDialog

          本文链接:https://www.haomeiwen.com/subject/lipwrltx.html