# FancyDialog **Repository Path**: ZCY8/FancyDialog ## Basic Information - **Project Name**: FancyDialog - **Description**: Kotlin + DSL风格代替传统的Builder模式 封装了几种常见的Dialog 高阶函数代替自定义回调接口 书写起来超级顺手 - **Primary Language**: Kotlin - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-02-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FancyDialog ## DSL风格代替Builder模式 ### 什么是DSL domain specific language / DSL **一组特定的语言结构** DSL风格或者也可以说是**函数式风格** Java使用Builder来构建复杂对象。 而Kotlin中配合**lambad** 使用DSL风格 将使复杂对象的构建更加可读,更清晰,更简洁 书写起来**舒服顺手** 首先我们要明白`lambda`的几个特性 * 如果`lambda`是函数的最后一个参数,可以放在**括号外面** * 如果`lambda`是函数的唯一参数,它可以放在**括号外面**并且**省略括号** * 指定接收者的`lambda` * 高阶函数代替传统的自定义回调接口 通过**`apply(block)`** 来配置dialog所需要的参数。而不需要通过不断的**`.setXXX`**来设置 >Tips : 使用高阶函数会带来一些运行时的效率损失:每一个函数都是一个对象,并且会捕获一个闭包。 即那些在函数体内会访问到的变量。 内存分配(对于函数对象和类)和虚拟调用会引入运行时间开销。 进而使用 **`inline`** 修饰函数 使用姿势 关键属性解析 * `mWidth` / `mHeight` 宽度和高度 * `mGravity` 居中/居* * `mOffsetX` / `mOffsetY` 位置偏移量 * `touchOutside` 触摸外部消失 * `lowerBackground` 降级dialog背景,配合[newToast](https://github.com/o0o0oo00/NewToast)可实现 Alert警告框不会被Dialog阴影覆盖掉 下面提供几种常见的dialog使用形式 ### askDialog #### normal ``` askDialog(supportFragmentManager) { mTitle = "标题" sureClick { Toast.makeText(this@MainActivity, "sure", Toast.LENGTH_SHORT).show() } cancelClick { Toast.makeText(this@MainActivity, "cancel", Toast.LENGTH_SHORT).show() } } ``` #### onlySure ``` askDialog(supportFragmentManager) { mTitle = "标题" mMessage = "摘要vv摘要摘要摘要摘要摘要" mGravity = Gravity.TOP onlySure = true sureClick { Toast.makeText(this@MainActivity, "sure", Toast.LENGTH_SHORT).show() } } ``` ### askMoreDialog ``` askMoreDialog(supportFragmentManager) { mTitle = "标题" mMessage = "摘要vv摘要摘要摘要摘要摘要摘要vv摘要摘要摘要摘要摘要" mColor = Color.RED sureClick(key = "第一个") { Toast.makeText(this@MainActivity, "第一个", Toast.LENGTH_SHORT).show() } cancelClick(key = "第二个") { Toast.makeText(this@MainActivity, "第二个", Toast.LENGTH_SHORT).show() } button3Clicks(key = "第三个", color = Color.GRAY) { Toast.makeText(this@MainActivity, "第三个", Toast.LENGTH_SHORT).show() } } ``` ### editDialog ``` editDialog(supportFragmentManager) { rightClick { Toast.makeText(this@MainActivity, it, Toast.LENGTH_SHORT).show() } } ``` ### listDialog ``` fun list(view: View) { lateinit var dialog: ListDialog val click: (View, Int) -> Unit = { v, position -> dialog.dismiss() Toast.makeText(this@MainActivity, (v.tag as String), Toast.LENGTH_SHORT).show() } val longClick: (View, Int) -> Unit = { v, position -> // dialog.dismiss() Toast.makeText(this@MainActivity, "longClick" + (v.tag as String), Toast.LENGTH_SHORT).show() } dialog = listDialog { listSetting(click, longClick) { add("第一头条") add("第二头条") add("_(:з」∠)_") } } dialog.show(supportFragmentManager, "dialog") } ``` ### customDialog 待续...