我有一个全屏
FrameLayout
,其中包含我在运行时添加的四个视图:
repeat(4) { i ->
val view = View(this).apply {
setBackgroundColor(COLOR[i])
}
views += view
container.addView(view)
}
并处理画中画模式大小的变化我已经实施了
onSizeChanged
方法:
container = object : FrameLayout(this) {
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
resizeViews(w, h)
}
}
并根据新的宽度和高度调整我的视图:
private fun resizeViews(width: Int, height: Int) {
val isRtl = resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
val rtlFactor = if (isRtl) -1.0F else 1.0F
views.forEachIndexed { i, view ->
val x = width * LAYOUT[i].first * rtlFactor
val y = height * LAYOUT[i].second
val w = width / 2
val h = height / 2
val layoutParams = FrameLayout.LayoutParams(w, h)
view.x = x
view.y = y
view.layoutParams = layoutParams
}
container.post {
container.requestLayout()
}
}
这是我的常量:
companion object {
private val LAYOUT = listOf(
0.0F to 0.0F,
0.5F to 0.0F,
0.0F to 0.5F,
0.5F to 0.5F,
)
private val COLOR = listOf(
Color.RED,
Color.GREEN,
Color.YELLOW,
Color.BLUE,
)
}
但是在切换到 RTL 布局后,PiP 窗口开始表现不同:
布局检查器显示我的视图已绘制在屏幕外的某处
当我从 PiP 返回全屏时,会发生这种情况:
我已经记录了所有尺寸计算结果,除了 Xs 的负值外,LTR 和 RTL 模式没有区别,因为它在 Android 中是这样工作的。
我还尝试了不同的解决方案,例如删除所有视图并使用新的布局选项再次添加它们,或者在每个视图上发布
requestLayout
但没有一个有效。
如有任何意见或建议,我们将不胜感激。