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

关于这个偏移量,这里我多说两句,原本偏移量的取值范围是在[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)

效果如图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

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

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样你还可以这样写:

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(R.id.realView)
val touchView = rootView.findViewById(R.id.bottomTouchView)
val topTouchView = rootView.findViewById(R.id.topTouchView)
val maskLayout = rootView.findViewById(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(R.id.realView)
val touchView = it.findViewById(R.id.bottomTouchView)
val topTouchView = it.findViewById(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)

效果图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本的显示模式都已经说了,接下来就放一个整体可见的参数表格出来
GenjiDialog中
属性名/方法名介绍
rootViewlayoutId所对应的布局
getMyActivity()获取该dialog所在的activity
setDialogOptions(…)设置dialogOptions
getDialogOptions()获取dialogOptions
extendsOptions()当继承GenjiDialog时需要重写该方法,在该方法里面设置新的dialogOptions
showOnWindow(…)将dialog显示在屏幕中,有多个重载方法,具体可见源码注释
showOnView(…)将dialog依附于某个View,有多个重载方法,具体可见源码注释
DialogOptions
属性名/方法名介绍
layoutId布局id,默认:R.layout.loading_layout
dialogStyledialog的样式,一般情况下不用修改,为了方便某些朋友可能有特殊需求,所以放出来可供重写,默认:DialogFragment.STYLE_NO_TITLE
dialogThemeFundialog的主题,同上,重写方法setDialogTheme(fun)
setStatusBarModeFundialog的状态栏设置,同上,重写方法setStatusMode(fun)
animStyledialog的进出动画,用于一般情况,内置了很多日常所需动画,可以到res/values/styles中查看,动画文件在res/anim中查看,默认根据gravity来判断
setOnEnterAnimator(fun)dialog的进入动画,这个动画是用于一些特殊情况,比如上面的带遮罩的滑出动画,默认:null
exitAnimator(fun)dialog的退出动画,同上 (这两个动画的示例请看上面带遮罩滑出动画的代码,也可以去源码查看)
canClick否可以触发取消,默认:true,比如在动画开始时将此属性设置false,防止在动画进行时,被再次触发动画,当使用上面两种自定义特殊动画时,我已经默认添加了改变这个状态值的监听
isLazy是否懒加载,默认:false,是否在动画完成时才执行convertListener
duration懒加载的延时,默认:0L,配合isLazy使用,这个值一般设置为动画的时长,为了保证动画流畅
dialogStatusBarColordialog的statusBar颜色,默认:透明,一般来说无需改变
widthdialog宽度,默认:0px
heightdialog高度,默认:0px
isFullHorizontaldialog是否横向占满,默认:false
isFullVerticaldialog是否纵向占满,默认:false,该纵向占满并非全屏,纵向占满会自动扣掉状态栏的高度
isFullVerticalOverStatusBardialog是否纵向占满,默认:false,该纵向占满全屏不会扣掉状态栏高度,是真正的全屏
verticalMargindialog上下边距,默认:0,详细注释请在源码中查看
horizontalMargindialog左右边距,默认:0,详细注释请在源码中查看

学习分享

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包

「Android面试知识体系」学习思维导图压缩包**

[外链图片转存中…(img-XskLIcxW-1720112727426)]

[外链图片转存中…(img-crHVDfrW-1720112727426)]

[外链图片转存中…(img-NdGkE7mS-1720112727427)]

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin 中,你可以通过自定义 Dialog 类来创建自定义对话框。 首先,创建一个继承自 Dialog 类的自定义对话框类。在该类中,你可以指定对话框的布局和行为。 下面是一个示例: ```kotlin import android.app.Dialog import android.content.Context import android.os.Bundle import android.view.Window import kotlinx.android.synthetic.main.your_dialog_layout.* class YourCustomDialog(context: Context) : Dialog(context) { private var positiveClickListener: (() -> Unit)? = null private var negativeClickListener: (() -> Unit)? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestWindowFeature(Window.FEATURE_NO_TITLE) setContentView(R.layout.your_dialog_layout) // 设置对话框的标题、内容等 titleTextView.text = "标题" messageTextView.text = "内容" // 设置按钮的点击事件 positiveButton.setOnClickListener { positiveClickListener?.invoke() dismiss() } negativeButton.setOnClickListener { negativeClickListener?.invoke() dismiss() } } fun setPositiveClickListener(listener: () -> Unit) { positiveClickListener = listener } fun setNegativeClickListener(listener: () -> Unit) { negativeClickListener = listener } } ``` 在上面的示例中,我们在 onCreate() 方法中设置了对话框的标题和内容,并为按钮设置了点击事件。 接下来,在你的 Activity 中使用自定义对话框。在合适的地方,创建自定义对话框的实例,并设置按钮的点击事件。 ```kotlin val dialog = YourCustomDialog(this) dialog.setPositiveClickListener { // 处理“确认”按钮的点击事件 } dialog.setNegativeClickListener { // 处理“取消”按钮的点击事件 } dialog.show() ``` 在上面的代码中,我们创建了自定义对话框的实例,并为“确认”和“取消”按钮设置了点击事件处理逻辑。最后,调用 `show()` 方法显示对话框。 记得将 `your_dialog_layout` 替换为你自定义对话框的布局文件名。 这样,你就可以在 Kotlin 中创建自定义对话框了。你可以根据自己的需求定制对话框的布局和行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值