このレイアウトを検討してください(ここから引っ張ってきました):
このレイアウトを画面サイズに合わせて拡大縮小する原理を理解したいと思います。正方形の場合、カスタム onMeasure 関数がうまく機能します。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
以下のカスタム Togglebuttons と Imagebuttons の幅と高さは、画面の残りの部分 (layout_margins を除く) を満たすようにスケーリングする必要があり、内部のテキストと画像は、ボタンを埋めるためにスケーリングする必要があります (パディングを除く)。外側のマージンもスケーリングする必要があります。
私が最初に考えたのは、相対レイアウトを使用してボタンを配置し、layout_margin/padding 属性を使用してマージンを作成することでした。ただし、相対レイアウトと layout_margin/padding には固定ピクセル値が必要なため、スケーラブルではありません。
次に、layout_weights を使用してネストされたリニア レイアウトを使用してボタンを配置し、プレースホルダー ビューを使用して余白を作成することを考えました。これらの手法はスケーラブルですが、ボタンには固定ピクセル値を必要とする多くの属性 (テキスト サイズ、画像サイズ、角の半径など) があるため、ボタンでは機能しません。この制限は、たとえば、次の xml を意味します。
<ToggleButton
android:layout_weight="1"
style="@style/myButton"
[...] />
<View
android:layout_weight="1"/>
<ImageButton
android:layout_weight="1"
style="@style/myButton"
[...] />
必ずしも 2 つのボタンとそれらの間のスペースがすべて同じ幅になるとは限りません。それはすべて、ボタンのテキストサイズ、画像サイズなどに依存します。
私はこの質問を見てきましたが、非XMLに頼る必要のない、このような単純な問題に対するより単純な解決策があるはずだと感じています。