一个kotlin编写的dialog库,希望这是你使用的最后一个dialog库

GenjiDialog

基于kotlin的通用dialog

之前我是自己Fork了的一个叫NiceDialog的库,
但是在这基础上自己加了很多功能来自用,但是后来开始用kotlin开发之后,
发现很多东西都能简化,毕竟kotlin的语法糖不能浪费了,所以就有了这个库,
只要我还在做Android开发,应该会一直维护该库。

项目地址:https://github.com/q876625596/GenjiDialogV2

依赖

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    implementation 'com.github.q876625596:GenjiDialogV2:1.1.0'
}

废话不多说,直接上图

show_on_window.gif
show_on_view.gif
show_mask_slide.gif

内置大量基础动画,基本能满足基本需求

第一次写README也不知道该怎么吹,就直接贴代码吧

newGenjiDialog {
    width = dp2px(100f)
    height = dp2px(100f)
}.showOnWindow(supportFragmentManager)

就这么简单,一个默认居中的加载中loadDialog就出来了,如图:

loading.gif

1、位置

如果我想让他显示在屏幕右上角怎么办?非常简单!

newGenjiDialog {
    width = dp2px(100f)
    height = dp2px(100f)
    gravity = DialogGravity.RIGHT_TOP
}.showOnWindow(supportFragmentManager)

DialogGravity这个枚举中我设定了9种显示方式,左上,中上,右上,左中,正中,右中,左下,中下,右下

因此只需要添加一行代码指定dialog的位置就行了、效果如图:

loading_right_top.gif

你现在可能要问了,你只设置了9个位置,我需要偏移怎么办呢,
当然,这时候就需要用到偏移了

newGenjiDialog {
    width = dp2px(100f)
    height = dp2px(100f)
    verticalMargin = dp2px(100f).toFloat()
    horizontalMargin = dp2px(100f).toFloat()
    gravity = DialogGravity.RIGHT_TOP
}.showOnWindow(supportFragmentManager)

就这样我就给dialog加上了横向纵向分别100dp的偏移,效果如图:

loading_right_top_margin.gif

关于这个偏移量,这里我多说两句,原本偏移量的取值范围是在[0-1],指的是所占屏幕宽高的百分比,
但是为了方便起见,我这里给大于1的偏移量自动换算成了百分比,如果针对个别机型有误差的,可以自行换算成[0-1]即可

2、动画

细心地你可能发现了,在屏幕右上角显示的时候是从屏幕边缘滑出的,
没错,我给DialogGravity的每一个显示位置都设定了默认的动画,
当没有指定动画的时候就会按照默认的动画来显示、

当然自定义动画是肯定要有的

newGenjiDialog {
    width = dp2px(100f)
    height = dp2px(100f)
    animStyle = R.style.ScaleADEnterExitAnimationX50Y50
    gravity = DialogGravity.RIGHT_TOP
}.showOnWindow(supportFragmentManager)

这样就完成了动画的自定义,当然你还可以这样写:

dialog.showOnWindow(supportFragmentManager,DialogGravity.RIGHT_TOP,R.style.ScaleADEnterExitAnimationX50Y50)

效果如图:

loading_right_top_scale_ad.gif

内置动画我在style文件中注释写了作用,可以自己去看看

如果想要贴在一个view附近怎么办?

newGenjiDialog {
    width = dp2px(100f)
    height = dp2px(100f)
    animStyle = R.style.ScaleADEnterExitAnimationX50Y100
    gravityAsView = DialogGravity.CENTER_TOP
}.showOnView(supportFragmentManager,showLoading)

需要注意的是这里的gravaty换成了gravityAsView,效果如图:

loading_center_top_as_view.gif

同样你还可以这样写:

dialog.showOnWindow(supportFragmentManager,DialogGravity.RIGHT_TOP,R.style.ScaleADEnterExitAnimationX50Y50)
相对view的偏移量 offsetX和offsetY属性

这两个属性建议去DialogOptions中的dialogAsView()方法去查看方法注释

附加一个稍微特殊点的滑出方式(带遮罩)
newGenjiDialog { genjiDialog ->
    //设置布局
    layoutId = R.layout.slide_view_bottom
    //isLazy = true
    //设置横纵向占满
    isFullHorizontal = true
    isFullVerticalOverStatusBar = true
    //阴影透明度
    dimAmount = 0f
    //处理事件/数据绑定
    convertListenerFun { holder, dialog ->
        //设置点击realView以外的部分就dismiss
        holder.setOnClickListener(R.id.bottomTouchView) {
            if (canClick) {
                dialog.dismiss()
            }
        }.setOnClickListener(R.id.topTouchView) {
            if (canClick) {
                dialog.dismiss()
            }
        }
    }
    setOnEnterAnimator { rootView ->
        //在此处设置进入动画
        AnimatorSet().apply {
            duration = 500L
            val realView = rootView.findViewById<View>(R.id.realView)
            val touchView = rootView.findViewById<View>(R.id.bottomTouchView)
            val topTouchView = rootView.findViewById<View>(R.id.topTouchView)
            val maskLayout = rootView.findViewById<View>(R.id.maskLayout)
            //给realView的父布局(遮罩布局)设置距顶部margin
            maskLayout?.apply {
                layoutParams = (layoutParams as ConstraintLayout.LayoutParams).apply {
                    topMargin = (slideForBottom.y + slideForBottom.height).toInt()
                }
            }
            play(ObjectAnimator
                    .ofFloat(realView, "y", -UtilsExtension.dp2px(resources, 200f).toFloat(), 0f))
                    .with(ObjectAnimator
                            .ofFloat(touchView, "alpha", 0f, 1f))
                    .with(ObjectAnimator
                            .ofFloat(topTouchView, "alpha", 0f, 1f))
        }
    }
    setOnExitAnimator {
        //退出动画
        AnimatorSet().apply {
            duration = 500L
            val realView = it.findViewById<View>(R.id.realView)
            val touchView = it.findViewById<View>(R.id.bottomTouchView)
            val topTouchView = it.findViewById<View>(R.id.topTouchView)
            play(ObjectAnimator
                    .ofFloat(realView, "y", 0f, -UtilsExtension.dp2px(resources, 200f).toFloat()))
                    .with(ObjectAnimator
                            .ofFloat(touchView, "alpha", 1f, 0f))
                    .with(ObjectAnimator
                            .ofFloat(topTouchView, "alpha", 1f, 0f))
        }
    }
}.showOnWindow(supportFragmentManager)

效果图:

show_mask_slide_down.gif

基本的显示模式都已经说了,接下来就放一个整体可见的参数表格出来

GenjiDialog中
属性名/方法名 介绍
rootView layoutId所对应的布局
getMyActivity() 获取该dialog所在的activity
setDialogOptions(...) 设置dialogOptions
getDialogOptions() 获取dialogOptions
extendsOptions() 当继承GenjiDialog时需要重写该方法,在该方法里面设置新的dialogOptions
showOnWindow(...) 将dialog显示在屏幕中,有多个重载方法,具体可见源码注释
showOnView(...) 将dialog依附于某个View,有多个重载方法,具体可见源码注释
DialogOptions
属性名/方法名 介绍
layoutId 布局id,默认:R.layout.loading_layout
dialogStyle dialog的样式,一般情况下不用修改,为了方便某些朋友可能有特殊需求,所以放出来可供重写,默认:DialogFragment.STYLE_NO_TITLE
dialogThemeFun dialog的主题,同上,重写方法setDialogTheme(fun)
setStatusBarModeFun dialog的状态栏设置,同上,重写方法setStatusMode(fun)
animStyle dialog的进出动画,用于一般情况,内置了很多日常所需动画,可以到res/values/styles中查看,动画文件在res/anim中查看,默认根据gravity来判断
setOnEnterAnimator(fun) dialog的进入动画,这个动画是用于一些特殊情况,比如上面的带遮罩的滑出动画,默认:null
exitAnimator(fun) dialog的退出动画,同上 (这两个动画的示例请看上面带遮罩滑出动画的代码,也可以去源码查看)
canClick 否可以触发取消,默认:true,比如在动画开始时将此属性设置false,防止在动画进行时,被再次触发动画,当使用上面两种自定义特殊动画时,我已经默认添加了改变这个状态值的监听
isLazy 是否懒加载,默认:false,是否在动画完成时才执行convertListener
duration 懒加载的延时,默认:0L,配合isLazy使用,这个值一般设置为动画的时长,为了保证动画流畅
dialogStatusBarColor dialog的statusBar颜色,默认:透明,一般来说无需改变
width dialog宽度,默认:0px
height dialog高度,默认:0px
isFullHorizontal dialog是否横向占满,默认:false
isFullVertical dialog是否纵向占满,默认:false,该纵向占满并非全屏,纵向占满会自动扣掉状态栏的高度
isFullVerticalOverStatusBar dialog是否纵向占满,默认:false,该纵向占满全屏不会扣掉状态栏高度,是真正的全屏
verticalMargin dialog上下边距,默认:0,详细注释请在源码中查看
horizontalMargin dialog左右边距,默认:0,详细注释请在源码中查看
fullVerticalMargin dialog在上下占满时的边距,默认:0px
fullHorizontalMargin dialog在左右占满时的边距,默认:0px
dimAmount dialog背景的阴影的透明度:默认:0.3f
gravity dialog显示为showOnWindow()时的位置:默认:DialogGravity.CENTER_CENTER
gravityAsView dialog显示为showOnView()时的位置:默认:DialogGravity.CENTER_BOTTOM
dialogViewX x轴坐标值,用于特殊动画时定位dialog,默认:0px
dialogViewY y轴坐标值,用于特殊动画时定位dialog,默认:0px
offsetX 当dialog依附在view上时x轴的偏移量,默认:0px
offsetX 当dialog依附在view上时x轴的偏移量,默认:0px
touchCancel 是否点击屏幕区域取消(不包含返回按钮),默认:false
outCancel 是否点击外部取消,默认:false,当 touchCancel == true时此属性无效,必须是 touchCancel和该属性均为false时,那么点击屏幕区域和返回按钮都不能关闭dialog
showDismissMap 显示与消失的监听map
onKeyListener 按钮监听
convertListener view初始化

这里我给出的属性/方法,注释不详细可以到DialogOptions源码里面查看,那里面注释很详细

因为也是第一次写kotlin的库,可能有一些东西不算很完美,希望有能力强的大佬能够指出

喜欢的话请点个star支持一下,谢谢

项目地址:https://github.com/q876625596/GenjiDialogV2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349