自定义方形LinearLayout。 怎么样?

我为方形布局创build我自己的类:

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代码。 但是,而是如果我的布局和我的形象,我只看到一个白色的矩形…

我错了什么?

Related of "自定义方形LinearLayout。 怎么样?"

//你忘记调用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 。 我无法正确alignment底部边缘。 改为改用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)); } 

编辑:

下面的解决scheme现在已经被废弃了,因为ConstraintLayout已经成为新的标准并提供了这个function。

原始答案:

原来Android团队给了我们解决scheme,但没有人知道! 从百分比支持库中查看这两个类:

  • PercentFrameLayout
  • PercentRelativeLayout

如果你想强加一个视图的比例,你必须把它放在这些布局之一。 因此,在这种情况下,您必须将标准的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'c​​om.android.support:percent:23.3.0 compile 'com.android.support:percent:23.3.0'根据需要调整版本号