我想布局如下所示的 View ,但不确定如何去做:
这是我在想像的一幅小图:
.----------------------.
| .--------------. |
| 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中使用来自图像的MySurfaceView
的SomeOtherView
。 RelativeLayout的问题在于,它不会以允许我确定纵横比的方式来协商宽度/高度。onMeasure
在测量过程中被多次调用,RelativeLayout的工作方式是先询问自定义 View 的宽度,而不告诉它可用的高度,然后再返回并询问高度,同时将宽度锁定为您所要的高度在第一遍中指定(MeasureSpec.EXACTLY
)。这使得无法生成一定比例的 View ,因为您必须在知道可用高度之前先确认宽度。
一旦进入FrameLayout,我就不会遇到这个问题,因为传递给onMeasure
的MeasureSpecs仅具有AT_MOST
限制。这意味着我在每次通过onMeasure时都可以自由更改宽度和高度,因此最终可以根据给定的可用面积来计算自己的宽高比。
尚未确认这适用于所有情况,但希望这会对某人有所帮助。
关于android - 用固定的宽高比SurfaceView填充剩余空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10510371/