NYDialog

2021-04-29  本文已影响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)

            }
        }


    }

    /*定制接口
    * */


}
上一篇下一篇

猜你喜欢

热点阅读