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

6bc51xsx  于 2023-04-10  发布在  Android
关注(0)|答案(1)|浏览(137)

bounty还有4天到期,回答此问题可获得+100声望奖励,Mohsen Mirhoseini希望引起更多关注此问题:我需要一个解决方案或一个有效的讨论与体面的推理,以帮助我解决我的问题。

我有一个全屏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()
    }
}

以下是我的consts:

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布局后,画中画窗口开始以不同的方式运行:

布局检查器显示我的视图已被绘制到屏幕外的某个位置

当我从画中画返回到全屏时,会发生以下情况:

我已经记录了所有的大小计算,LTR和RTL模式之间没有区别,除了Xs的负值,因为它是如何在Android中工作的。
我还尝试了不同的解决方案,比如删除所有视图,然后使用新的布局选项再次添加它们,或者在每个视图上发布requestLayout,但它们都不起作用。
任何意见或建议将不胜感激。

qpgpyjmq

qpgpyjmq1#

我没有找到根本原因或适当的解决方案。
我很幸运,我的内部布局没有需要绘制RTL的UI元素,因此我在运行时将布局方向切换到LTR,它工作得很好:

container.layoutDirection = View.LAYOUT_DIRECTION_LTR

但仍在寻找原因和适当的解决办法。

相关问题