kongzue / DialogX

💬 DialogX dialog box component library, easy to use, more customizable, more scalable, easy to achieve a variety of dialog boxes. DialogX对话框组件库,更加方便易用,可自定义程度更高,扩展性更强,轻松实现各种对话框、菜单和提示效果,更有Material You、iOS、MIUI等主题扩展可选
Apache License 2.0
2.09k stars 217 forks source link

【功能建议】FullscreenDialog下潜背景R角 #396

Closed Matcha-xiaobin closed 12 months ago

Matcha-xiaobin commented 1 year ago

功能建议

需求描述:

是否可以对FullscreenDialog弹出时,背景下潜给整个圆角? 这样视觉效果会更加舒适,现在的在下潜时,背景圆角对不上手机的圆角,当下潜距离不远时,会被屏幕的圆角切割背景的角,视觉效果有点小遗憾。

Android S api31+ 的windowInsets中可以获取到屏幕R角半径,WindowInsetsCompat中没有此方法。 image

另外,google提供的那个BottomSheetDialog,BottomSheetDialogFragment,在拉起到全屏时,弹窗背景的背景会有个动画效果上移到状态栏下面(可能是利用惯性滑动?总之就是很丝滑),而且,上移到状态栏下面的那个背景似乎就做了这个R角,而且,也许可以参考下。

Matcha-xiaobin commented 1 year ago

我刚去尝试了下,要做到这个,需要升级项目 compileSdk 30 -> 31 targetSdk 30 -> 31 这样,windowInsets里,才会有这个获取圆角的方法,虽然实现这种效果确实看起来视觉上很棒,但只有在android12+才能有这效果。

image

https://github.com/kongzue/DialogX/assets/5775066/afdb7236-2f99-42fb-9b74-20613b37fe51

kongzue commented 1 year ago

了解,当前全屏对话框采用的方案是随着对话框上移背景圆角逐渐呈现的方案,如果要设置对话框圆角可以使用:

.setRadius(float px)

但目前没有提供设置背景圆角的接口,会进行评估。

目前评估采用的方案将类似于 iOS 的方案,若可以获取设备圆角,将从设备圆角至可自定义值进行渐变,但不会保持设备圆角大小,不然会显得很突兀。

kongzue commented 1 year ago

新版本中:

全屏对话框的背景缩放将默认从设备圆角(若无法获取则依照当前默认值0,即直角)向内缩小的同时,圆角渐变为activityContentRadius值,activityContentRadius默认取对话框圆角值radius,若对话框圆角未设置默认15dp。

将添加一个接口:setActivityContentRadius(float) 你可以指定一个值,用于指定全屏对话框背景向内缩放到的目标圆角值; 将添加一个接口:setDeviceRadius(int) 用于在非支持设备上指定一个设备圆角大小值;

setActivityContentRadius 还可指定标准设置:FullScreenDialog.ACTIVITY_CONTENT_RADIUS_KEEP 此设置将使背景圆角不进行变化,保持按照设备圆角值进行缩小。

本次修改已提交代码,将在下一个版本合并更新。

Matcha-xiaobin commented 1 year ago

新版本中:

全屏对话框的背景缩放将默认从设备圆角(若无法获取则依照当前默认值0,即直角)向内缩小的同时,圆角渐变为activityContentRadius值,activityContentRadius默认取对话框圆角值radius,若对话框圆角未设置默认15dp。

将添加一个接口:setActivityContentRadius(float) 你可以指定一个值,用于指定全屏对话框背景向内缩放到的目标圆角值; 将添加一个接口:setDeviceRadius(int) 用于在非支持设备上指定一个设备圆角大小值;

setActivityContentRadius 还可指定标准设置:FullScreenDialog.ACTIVITY_CONTENT_RADIUS_KEEP 此设置将使背景圆角不进行变化,保持按照设备圆角值进行缩小。

本次修改已提交代码,将在下一个版本合并更新。

新版本中:

全屏对话框的背景缩放将默认从设备圆角(若无法获取则依照当前默认值0,即直角)向内缩小的同时,圆角渐变为activityContentRadius值,activityContentRadius默认取对话框圆角值radius,若对话框圆角未设置默认15dp。

将添加一个接口:setActivityContentRadius(float) 你可以指定一个值,用于指定全屏对话框背景向内缩放到的目标圆角值; 将添加一个接口:setDeviceRadius(int) 用于在非支持设备上指定一个设备圆角大小值;

setActivityContentRadius 还可指定标准设置:FullScreenDialog.ACTIVITY_CONTENT_RADIUS_KEEP 此设置将使背景圆角不进行变化,保持按照设备圆角值进行缩小。

本次修改已提交代码,将在下一个版本合并更新。

我看了一下,从windowInsets中获取的radius,直接用的话,似乎并不能很好的贴合实际屏幕,例如我上面的例子中,我 乘了 1.5 ~ 1.6 左右,才在人眼视觉上贴合了我手机的圆角,但我这边测试设备只有我手上这一台,圆角在 Point(99,99) 状态栏非安全区高度在 112 image 是不是对背景裁切圆角时,裁切的方式不对,导致圆角没有贴合实际设备的圆角?

Matcha-xiaobin commented 1 year ago

关于这个R角,其实我的主要目的是为了在那些弹窗高度比较小的时候,那个下潜背景的上面两个角不被设备的R角给遮挡,能完全看见,达到视觉上的美观

例如这个手机:

https://github.com/kongzue/DialogX/assets/5775066/856fa884-ca83-49d8-ba80-f9448d0f9048

Matcha-xiaobin commented 1 year ago

如果能有一套好的方案来获取这个手机的实际圆角半径就好了。 安卓这边真的是太难适配了。

kongzue commented 1 year ago

这个确实是Google的遗漏,高版本增加也只是补充罢了,再加上Android的设备差异相比iOS大得多也没办法做通用适配方案,我之前看过小米提供的一个私有API但不知为何我测试获取到的设备圆角为0基本上算无效,单独适配的成本也过高了,目前在最新提交的代码中提供的 setDeviceRadius(int) 也只是为了提供给部分固定设备上使用的app罢了