android - Jetpack 撰写 : What is the best way to support all screen sizes?

标签 android android-jetpack-compose

我在 Google 上搜索了多种使用 Jetpack compose 在 Android 上支持多种屏幕尺寸的方法,我终于找到了 Google 文档: https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#compose

enum class WindowSizeClass { COMPACT, MEDIUM, EXPANDED }

@Composable
fun Activity.rememberWindowSizeClass() {
    val configuration = LocalConfiguration.current
    val windowMetrics = remember(configuration) {
        WindowMetricsCalculator.getOrCreate()
            .computeCurrentWindowMetrics(this)
    }
    val windowDpSize = with(LocalDensity.current) {
        windowMetrics.bounds.toComposeRect().size.toDpSize()
    }
    val widthWindowSizeClass = when {
        windowDpSize.width < 600.dp -> WindowSizeClass.COMPACT
        windowDpSize.width < 840.dp -> WindowSizeClass.MEDIUM
        else -> WindowSizeClass.EXPANDED
    }

    val heightWindowSizeClass = when {
        windowDpSize.height < 480.dp -> WindowSizeClass.COMPACT
        windowDpSize.height < 900.dp -> WindowSizeClass.MEDIUM
        else -> WindowSizeClass.EXPANDED
    }

    // Use widthWindowSizeClass and heightWindowSizeClass
}

但这可能是 ldpi 屏幕和存储这些变量的问题?我是否需要像旧方法一样将尺寸值存储在所有密度的尺寸文件夹中?因为例如 400dp 屏幕上的图像在 ldpi 屏幕(~120dp)上可能看起来很大 我很困惑,而且我是 Jetpack Compose 的新手。预先感谢您的帮助。

最佳答案

您可以使用库 https://github.com/GetStream/butterfly 要么 创建

记住WindowSizeClass.kt

data class WindowSizeClass(
    val widthWindowSizeClass: WindowType,
    val heightWindowSizeClass: WindowType,
    val widthWindowDpSize: Dp,
    val heightWindowDpSize: Dp
) {
    sealed class WindowType {
        object COMPACT : WindowType()
        object MEDIUM : WindowType()
        object EXPANDED : WindowType()
    }
}

@Composable
fun Activity.rememberWindowSizeClass(): WindowSizeClass {
    val configuration = LocalConfiguration.current
    val windowMetrics = remember(configuration) {
        WindowMetricsCalculator.getOrCreate()
            .computeCurrentWindowMetrics(activity = this)
    }
    val windowDpSize = with(LocalDensity.current) {
        windowMetrics.bounds.toComposeRect().size.toDpSize()
    }
    return WindowSizeClass(
        widthWindowSizeClass = when {
            windowDpSize.width < 0.dp -> throw IllegalArgumentException("Dp value cannot be negative")
            windowDpSize.width < 600.dp -> WindowSizeClass.WindowType.COMPACT
            windowDpSize.width < 840.dp -> WindowSizeClass.WindowType.MEDIUM
            else -> WindowSizeClass.WindowType.EXPANDED
        },
        heightWindowSizeClass = when {
            windowDpSize.height < 0.dp -> throw IllegalArgumentException("Dp value cannot be negative")
            windowDpSize.height < 480.dp -> WindowSizeClass.WindowType.COMPACT
            windowDpSize.height < 900.dp -> WindowSizeClass.WindowType.MEDIUM
            else -> WindowSizeClass.WindowType.EXPANDED
        },
        widthWindowDpSize = windowDpSize.width,
        heightWindowDpSize = windowDpSize.height
    )
}

MainActivity.kt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val windowSize = rememberWindowSizeClass()
            when (windowSize.widthWindowSizeClass) {
                is WindowSizeClass.WindowType.COMPACT -> {
                    AppScreenCompact()
                }
                is WindowSizeClass.WindowType.MEDIUM -> {
                    AppScreenMedium()
                }
                else -> {
                    AppScreenExpanded()
                }
            }
        }
    }
}

有关更多信息,请参阅 DocumentationSample

关于android - Jetpack 撰写 : What is the best way to support all screen sizes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69905110/

相关文章:

android - 更新我的 Android 应用程序

android - 分段进度条android

android - 如果应用程序未启动,广播接收器不会收到广播

android - Jetpack compose 中的任何小部件是否可以 "Scale"宽度和高度?

android - 行中子项的填充高度

android - AnimatedVisibility 和 SwipeToDismiss Enter 动画不触发 - Jetpack Compose

android - Resources$NotFoundException : If the resource you are trying to use is a vector resource, 您可能以不受支持的方式引用它

java - 避免多重if的设计模式

android - backStack 到 jetpack compose 界面时再次调用 api

android - 底部导航栏与 Jetpack Compose 中的屏幕内容重叠