my windowmanager.layoutparams Для высоты представления установлено значение windowmanager.layoutparams.wrap_content . Компонируется внутри Composeview аниматы, все окно мерцает или заикается вместо того, чтобы плавно изменять размер. Кажется, Windowmanager пытается выполнить полную реле на каждом отдельном кадре анимации, вызывая этот визуальный сбой. Высота контента является динамической и не известна заранее. Код деятельности для добавления представления в Windowmanager
Этот код устанавливается и добавляет пользовательский Framelayout , содержащий наш Composeview к Windowmanager .
Код: Выделить всё
class OverlayActivity : AppCompatActivity() {
private lateinit var windowManager: WindowManager
private lateinit var customView: FrameLayout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// A basic layout for the activity
setContentView(R.layout.activity_main)
// Add the overlay after a short delay
findViewById(android.R.id.content).postDelayed({
addCustomViewToWindow()
}, 1000)
}
private fun addCustomViewToWindow() {
windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
// This is our custom FrameLayout that will hold the ComposeView
customView = CustomViewToAttachToRoot(this, this)
val layoutParams = WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT, // The root of the problem
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // Ensure you have the permission
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT
).apply {
gravity = Gravity.BOTTOM
}
val customComposeView = ComposeView(this).apply {
setContent {
ChangingHeightComposable()
}
}
customView.addView(customComposeView)
windowManager.addView(customView, layoutParams)
}
override fun onDestroy() {
super.onDestroy()
if (::windowManager.isInitialized && ::customView.isInitialized) {
windowManager.removeView(customView)
}
}
}
< /code>
[b] 2. Custom Framelayout Этот класс используется для размещения Composeview и правильно установить LifeCycleowner и SavedStateRegistryOwner , который необходим для составления для работы в правильном у Windowmaner . PrettyPrint-Override ">
Код: Выделить всё
@SuppressLint("ViewConstructor")
class CustomViewToAttachToRoot(
context: Context,
lifecycleOwner: LifecycleOwner
) : FrameLayout(context) {
init {
// Set owners for Compose interoperability
setViewTreeLifecycleOwner(lifecycleOwner)
setViewTreeSavedStateRegistryOwner(lifecycleOwner as SavedStateRegistryOwner)
// Set a CompositionStrategy
val composeView = ComposeView(context)
composeView.setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
addView(composeView)
}
}
< /code>
[b] 3. Компонируется с анимационной высотой [/b]
Это композитный, который непрерывно анимирует свою высоту между 100.dp Код: Выделить всё
@Composable
fun ChangingHeightComposable() {
val infiniteTransition = rememberInfiniteTransition(label = "heightTransition")
val animatedHeight by infiniteTransition.animateValue(
initialValue = 200.dp,
targetValue = 100.dp,
typeConverter = Dp.VectorConverter,
animationSpec = infiniteRepeatable(
animation = tween(durationMillis = 1000),
repeatMode = RepeatMode.Reverse
),
label = "animatedHeight"
)
Box(
modifier = Modifier
.fillMaxWidth()
.height(animatedHeight)
.background(Color.Cyan)
) {
}
}
Как можно предотвратить это мерцание и достичь плавной анимации высоты для Composeview , добавленного в Windowmanager с помощью wry_content ? Есть ли другой подход или конкретный флаг, который я должен использовать, чтобы сигнализировать на Windowmanager , чтобы обработать эти обновления более изящно?
Подробнее здесь: https://stackoverflow.com/questions/797 ... ap-content
Мобильная версия