我想布局如下所示的 View ,但不确定如何去做:

  • 在屏幕底部是一个常规 View ,具有固定大小(填充宽度和一定数量的dp代表高度)
  • 填充剩余的垂直空间,我想放置一个自glSurfaceView继承的自定义 View ,但要限制它必须具有固定的宽高比,这将以编程方式进行设置,但在创建 Activity 之前必须知道。 (在这种情况下,假设为2:3 w:h)。

  • 这是我在想像的一幅小图:
     .----------------------.
     |   .--------------.   |
     | b |              | b |
     | g |              | g |
     |   |              |   |
     | i |  MySurface   | i |
     | m |     View     | m |
     | a |              | a |
     | g |  (2:3 w:h)   | g |
     | e |              | e |
     |   *--------------*   |
     |.--------------------.|
     ||                    ||
     ||   SomeOtherView    ||
     ||                    ||
     |*--------------------*|
     *----------------------*
    

    就设置MySurfaceView而言,我认为正常的layout_width和layout_height不会对我有帮助,因为在将屏幕部分布局好并放置SomeOtherView之后,我才知道可用的屏幕大小。

    我想重写MySurfaceView中的某些功能,例如将可用屏幕空间作为参数传递,并让我决定如何设置 View 的宽度和高度吗?

    “通货膨胀”是我在这里寻找的正确用语吗?我认为这与我要寻找的东西有关,但是我真的不知道该术语。

    Updated below是我的研究结果,我认为这是一个可能的正确解决方案。

    最佳答案

    做了更多的研究,我想我明白了我需要做的事情:

    我一直想覆盖的函数是onMeasure(int widthSpec, int heightSpec),它由父级调用并给出宽度和高度的建议(请参阅View.MeasureSpec)。我也将MySurfaceView设置为在xml中具有wrap_content的layout_width/height。然后,当onMeasure被调用时,我可以计算可用的宽高比,并根据需要设置 View 的宽度和高度。

    我要做的第二件事是将MySurfaceView作为唯一的 child 放在FrameLayout中。我最初在RelativeLayout中使用来自图像的MySurfaceViewSomeOtherView。 RelativeLayout的问题在于,它不会以允许我确定纵横比的方式来协商宽度/高度。
    onMeasure在测量过程中被多次调用,RelativeLayout的工作方式是先询问自定义 View 的宽度,而不告诉它可用的高度,然后再返回并询问高度,同时将宽度锁定为您所要的高度在第一遍中指定(MeasureSpec.EXACTLY)。这使得无法生成一定比例的 View ,因为您必须在知道可用高度之前先确认宽度。

    一旦进入FrameLayout,我就不会遇到这个问题,因为传递给onMeasure的MeasureSpecs仅具有AT_MOST限制。这意味着我在每次通过onMeasure时都可以自由更改宽度和高度,因此最终可以根据给定的可用面积来计算自己的宽高比。

    尚未确认这适用于所有情况,但希望这会对某人有所帮助。

    关于android - 用固定的宽高比SurfaceView填充剩余空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10510371/

    10-10 09:55