Просмотр в Windowmanager Mlickers на анимированном изменении высоты с `wrap_content`Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Просмотр в Windowmanager Mlickers на анимированном изменении высоты с `wrap_content`

Сообщение Anonymous »

Я пытаюсь создать системное наложение с помощью Windowmanager . Это наложение содержит Composeview , который, в свою очередь, проводит композицию, которая анимирует его высоту.
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 
warper [/b]
Этот класс используется для размещения 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 
и 200.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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»