NYDialog

/**
 * 當前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 = ""http://標題
        private var mContent: String = ""http://文案
        private var mConfirmTxt: String = ""http://確定按鈕文案
        private var mCancelTxt: String = ""http://取消按鈕文案
        private var mCanceledOnTouchOutside: Boolean = true//是否需要關閉按鈕 默認true
        private var confirmListener: () -> Unit = {}//確定監(jiān)聽
        private var cancelListener: () -> Unit = {}//取消監(jiān)聽
        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
        }

        /*
        * 設置內(nèi)容
        * */
        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
        }

        /*
        * 創(chuàng)建按鈕
        * */
        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)
                //置空緩存解決彈窗緩存其他彈窗數(shù)據(jù)
                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)
            /*內(nèi)容*/
            //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)

            /*按鈕監(jiān)聽*/
            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內(nèi)容
        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]
                }
            }
        }

        /*按鈕監(jiān)聽*/
        //確定按鈕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
    }

    /*據(jù)和接口實現(xiàn)*/
    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)

            }
        }


    }

    /*定制接口
    * */


}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末申屹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缩抡,更是在濱河造成了極大的恐慌奠宜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞻想,死亡現(xiàn)場離奇詭異压真,居然都是意外死亡,警方通過查閱死者的電腦和手機蘑险,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門滴肿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佃迄,你說我怎么就攤上這事泼差」笊伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵堆缘,是天一觀的道長滔灶。 經(jīng)常有香客問我,道長吼肥,這世上最難降的妖魔是什么录平? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缀皱,結果婚禮上斗这,老公的妹妹穿的比我還像新娘。我一直安慰自己唆鸡,他們只是感情好涝影,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著争占,像睡著了一般燃逻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臂痕,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天伯襟,我揣著相機與錄音,去河邊找鬼握童。 笑死姆怪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的澡绩。 我是一名探鬼主播稽揭,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肥卡!你這毒婦竟也來了溪掀?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤步鉴,失蹤者是張志新(化名)和其女友劉穎揪胃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氛琢,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡喊递,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阳似。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骚勘。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖障般,靈堂內(nèi)的尸體忽然破棺而出调鲸,到底是詐尸還是另有隱情盛杰,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布即供,位于F島的核電站,受9級特大地震影響于微,放射性物質(zhì)發(fā)生泄漏逗嫡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一驱证、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦吻育、人聲如沸布疼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粟害。三九已至,卻和暖如春套鹅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菱魔。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工杰妓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巷挥,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓矾屯,卻偏偏與公主長得像排作,于是被迫代替她去往敵國和親亚情。 傳聞我的和親對象是個殘疾皇子衫生,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月墓阀,有人笑有人哭斯撮,有人歡樂有人憂愁吮成,有人驚喜有人失落种蝶,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,535評論 28 53
  • 信任包括信任自己和信任他人 很多時候,很多事情,失敗撵术、遺憾划滋、錯過会油,源于不自信,不信任他人 覺得自己做不成古毛,別人做不...
    吳氵晃閱讀 6,187評論 4 8
  • 怎么對待生活稻薇,它也會怎么對你 人都是哭著來到這個美麗的人間嫂冻。每個人從來到塵寰到升入天堂,整個生命的歷程都是一本書塞椎,...
    靜靜在等你閱讀 4,974評論 1 6