【问题标题】:How to use View.layout() method to change view size?如何使用 View.layout() 方法更改视图大小?
【发布时间】:2020-02-04 11:09:57
【问题描述】:

我在做一个小游戏时遇到了问题,它在ConstraintLayout 中添加了很多视图(我已经用FrameLayoutRelativeLayoutLinearLayout 进行了测试。前两个具有相同的结果,而线性具有非常罕见的行为)并更改视图的大小和位置。

每个游戏循环 (33ms) 中的一些视图都在改变它的大小和位置,所以我在 LayoutParams 变量上执行此操作,该变量应用于每个循环的视图上的新大小。

params.width = realWidth;
params.height = realHeight;

我这样做是为了这个职位:

view.setX(realX);
view.setY(realY);

问题是,如果我不调用 view.requestLayout(),则更改不会反映,这是一个大问题,因为 requestLayout() 正在修复父布局及其所有子布局,从而减慢了游戏速度。

不调用requestLayout如何反映视图的大小变化?我读到您可以使用view.layout() 实现这一目标。 所以我用这个改变了我的代码:

view.layout((int)realX, (int)realY, (int)realX+realWidth, (int)realY+realHeight);

问题是 它在不调用 requestLayout() 的情况下工作 但是视图在使用 layout() 时具有非常罕见的行为,当我添加更多视图时,视图会在几毫秒内变得不可见并出现在左上角,之后它们出现在正确的位置,但突然它们在一个非常罕见的行为循环中一次又一次地变得不可见。

【问题讨论】:

    标签: android android-layout layout android-view layoutparams


    【解决方案1】:

    ConstraintLayout 很慢,尤其是当它包含许多 Views 时,如果它包含嵌套的 ConstraintLayouts,则更慢。

    由于您手动设置Views 的位置,您可以使用与ConstraintLayouts 不同的ViewGroup,并使用setX()setY()setTop() 等设置绝对位置。

    【讨论】:

    • 我已经用 FrameLayout、RelativeLayout 和 LinearLayout 进行了测试。前两个结果相同,线性行为非常罕见
    • 由于您正在开发游戏并且面临这些性能问题,我建议您尝试使用游戏引擎或以编程方式绘制这些视图,而不使用 Android Layout,而是使用纯 Java 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多