android - 是否有 Jetpack Compose 等效于 android:keepScreenOn 以保持屏幕活动?
问题描述
我有一个 Composable,它使用 Handler 来慢慢更新可组合内的图像的 alpha。但是,我看到屏幕在动画完成之前关闭。
在 XML 布局中,我们可以使用
android:keepScreenOn
或
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
有没有办法在不使用唤醒锁定权限的情况下使用 compose 来做到这一点?
解决方案
您可以LocalContext
用来获取活动,它有一个窗口,您可以在上面应用所需的标志。
在这种情况下,当您需要在视图外观和消失上运行一些代码时,DisposableEffect
可以使用:
@Composable
fun KeepScreenOn() {
val context = LocalContext.current
DisposableEffect(Unit) {
val window = context.findActivity()?.window
window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
onDispose {
window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
}
}
fun Context.findActivity(): Activity? {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
context = context.baseContext
}
return null
}
用法:当屏幕出现时标志设置为打开,当消失时 - 它被清除。
@Composable
fun Screen() {
KeepScreenOn()
}
正如@Louis CAD 正确指出的那样,如果在许多视图中使用此“视图”,您可能会遇到问题:如果出现一个使用它的视图,然后消失之前也使用它的视图,它将重置标志。
我还没有找到一种跟踪flags
状态来更新视图的方法,我认为@Louis CAD解决方案是可以的,直到 Compose 有一些系统支持。
推荐阅读
- sql-server - DBMS 和数据库 IDE 有什么区别?
- java - 如何从终端运行 Java public static void main
- java - 内存中存储和处理大型数据列表 Spring Boot 2 java
- node.js - Google App Engine 使用带有 NodeJ 的套接字
- php - 如何配置 WAMP 和 Wordpress 以进行定期站点维护
- linux - 如何将文件名解析为时间戳?
- android - 片段内的Android DataBinding
- node.js - 同一应用程序上的 Google App Engine 两个端口
- python - Python 3 kivy 属性错误
- azure-active-directory - Azure Active Directory - 清除令牌缓存