Android: cómo escalar un diseño con el tamaño de la pantalla

Considere este diseño (extraído deaquí):

Me gustaría entender los principios detrás de hacer esta escala de diseño con el tamaño de la pantalla. Para el cuadrado, una función onMeasure personalizada funciona bien:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}

El ancho y el alto de los botones de alternar personalizados y los botones de imagen a continuación deben escalarse para llenar el resto de la pantalla, menos layout_margins, y el texto y las imágenes deben escalar para llenar los botones, menos el relleno. El margen exterior también debe escalar.

Mi primer pensamiento fue utilizar un diseño relativo para posicionar los botones y los atributos layout_margin / padding para crear márgenes. Sin embargo, los diseños relativos y layout_margin / padding requieren valores de píxeles fijos, por lo que no son escalables.

Luego pensé en utilizar diseños lineales anidados con layout_weights para colocar los botones y las vistas de los marcadores de posición para crear márgenes. Aunque estas técnicas son escalables, no funcionan con botones, porque los botones tienen muchos atributos (tamaño del texto, tamaño de la imagen, radio de la esquina, etc.) que requieren valores de píxeles fijos. Esta limitación significa, por ejemplo, que el siguiente xml:

<ToggleButton 
    android:layout_weight="1"
    style="@style/myButton"
    [...] />
<View 
    android:layout_weight="1"/>
<ImageButton 
    android:layout_weight="1"
    style="@style/myButton"
    [...] />

No necesariamente hará que los dos botones, y el espacio entre ellos, todos del mismo ancho. Todo depende del tamaño del texto, el tamaño de la imagen, etc., de los botones.

He echado un vistazo aesta pregunta pero creo que debería haber una solución más simple para un problema tan simple, que no debería requerir recurrir a demasiado no XML.

Respuestas a la pregunta(3)

Su respuesta a la pregunta