正方形のレイアウト用に独自のクラスを作成します。
public class SquareLayout extends LinearLayout{
public SquareLayout(Context context) {
super(context);
}
public SquareLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SquareLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = width > height ? height : width;
setMeasuredDimension(size, size);
}
次に、私のxmlで:
...
<com.myApp.SquareLayout
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="center_horizontal"
Android:orientation="horizontal" >
<ImageView
Android:id="@+id/cellImageView"
Android:adjustViewBounds="true"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="2dp"
Android:padding="2dp"
Android:scaleType="centerCrop"
Android:src="@drawable/image" />
</com.myApp.SquareLayout>
...
Javaコードにはこれ以上何も書かれていません。しかし、代わりに、レイアウトと画像の場合、白い長方形しか表示されません...
私は何が間違っていますか?
// super.onMeasure(widthMeasureSpec、widthMeasureSpec);を呼び出すのを忘れています
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = width > height ? height : width;
setMeasuredDimension(size, size);
}
// xmlファイル
<com.example.testapplication.SquareLayout
Android:id="@+id/layout"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="center_horizontal"
Android:orientation="horizontal" >
<ImageView
Android:id="@+id/cellImageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginTop="2dp"
Android:adjustViewBounds="true"
Android:padding="2dp"
Android:scaleType="centerCrop"
Android:src="@drawable/ic_launcher" />
</com.example.testapplication.SquareLayout>
同じ手法をRelativeLayoutに適用すると、setMeasuredDimension
を直接呼び出すのに問題がありました。下端に対して正しく位置合わせできませんでした。代わりに、新しいメジャー仕様でsuper.onMeasure()
を呼び出すように変更するとうまくいきました。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int size = Math.min(width, height);
super.onMeasure(MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY));
}
編集:
ConstraintLayout が新しい標準になり、この機能を提供するため、以下のソリューションは非推奨になりました。
元の回答:
Androidチームが解決策を提供してくれましたが、誰もそれについて知りません! パーセントサポートライブラリ からこれらの2つのクラスをチェックしてください:
ビューの比率を適用する場合は、これらのレイアウトのいずれかに配置する必要があります。したがって、この場合、サブクラスではなく、標準のLinearLayout
を、適切なアスペクト比のこれらのレイアウトの1つに配置する必要があります。 PercentFrameLayout
を使用する場合の例:
<Android.support.percent.PercentFrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_aspectRatio="100%">
<!-- Whatever subviews you want here -->
</LinearLayout>
</Android.support.percent.PercentFrameLayout>
これで、すべてのビューが正方形の線形レイアウトに含まれるようになります。
gradleの依存関係を追加することを忘れないでくださいcompile 'com.Android.support:percent:23.3.0'
必要に応じてバージョン番号を調整します