我为方形布局创建了自己的类:
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代码中没有更多内容。 但相反,如果我的布局和我的图像,我只看到一个白色矩形...
我错了什么?
答案 0 :(得分:20)
//你忘记调用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>
答案 1 :(得分:9)
在将相同技术应用于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));
}
答案 2 :(得分:6)
修改强>
以下解决方案现已弃用,因为ConstraintLayout已成为新标准并提供此功能。
原始答案:
原来Android团队给了我们解决方案,但没人知道!查看Percent Support Library中的这两个类:
如果要强加视图的比例,则必须将其置于其中一个布局中。因此,在这种情况下,您必须在具有正确宽高比的其中一个布局中放置标准LinearLayout
,而不是您的子类。例如,如果您想使用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'
根据需要调整版本号