一個kotlin編寫的dialog庫,但願這是你使用的最後一個dialog庫

GenjiDialog

基於kotlin的通用dialog

v1.1.2更新: kotlin版本升級到1.2.60,buildGradle版本升級到3.1.4,針對github中的issue修改了以前在AAA類繼承GenjiDialog時,重寫extendsOptions()的使用方式(ps:v1.1.1版本是個廢棄版本,不知道爲何jitpack不編譯)

以前我是本身Fork了的一個叫NiceDialog的庫, 可是在這基礎上本身加了不少功能來自用,可是後來開始用kotlin開發以後, 發現不少東西都能簡化,畢竟kotlin的語法糖不能浪費了,因此就有了這個庫, 只要我還在作Android開發,應該會一直維護該庫。git

項目地址:https://github.com/q876625596/GenjiDialogV2github

依賴

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
複製代碼
dependencies {
    implementation 'com.github.q876625596:GenjiDialogV2:1.1.2'
}
複製代碼

廢話很少說,直接上圖app

show_on_window.gif

show_on_view.gif

show_mask_slide.gif

內置大量基礎動畫,基本能知足基本需求

第一次寫README也不知道該怎麼吹,就直接貼代碼吧

newGenjiDialog {
    width = dp2px(100f)
    height = dp2px(100f)
}.showOnWindow(supportFragmentManager)
複製代碼

就這麼簡單,一個默認居中的加載中loadDialog就出來了,如圖:maven

loading.gif

一、位置

若是我想讓他顯示在屏幕右上角怎麼辦?很是簡單!

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

DialogGravity這個枚舉中我設定了9種顯示方式,左上,中上,右上,左中,正中,右中,左下,中下,右下

所以只須要添加一行代碼指定dialog的位置就好了、效果如圖:ide

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]便可ui

二、動畫

細心地你可能發現了,在屏幕右上角顯示的時候是從屏幕邊緣滑出的, 沒錯,我給DialogGravity的每個顯示位置都設定了默認的動畫, 當沒有指定動畫的時候就會按照默認的動畫來顯示、url

固然自定義動畫是確定要有的

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

這樣就完成了動畫的自定義,固然你還能夠這樣寫:spa

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

相關文章
相關標籤/搜索