画中画 RTL 布局中 FrameLayout 内的自定义视图问题

问题描述 投票:0回答:0

我有一个全屏

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
但没有一个有效。

如有任何意见或建议,我们将不胜感激。

android android-custom-view right-to-left android-framelayout android-picture-in-picture
© www.soinside.com 2019 - 2024. All rights reserved.