如何在Android中为布局设置固定的宽高比

我试图将布局的宽度设置为“fill_parent”,同时使视图的高度只有相同的长度,以使布局成为正方形。

任何build议将不胜感激,提前致谢! :d

Solutions Collecting From Web of "如何在Android中为布局设置固定的宽高比"

通过引入ConstraintLayout,您不必编写单行代码或使用第三方,也PercentFrameLayout使用在26.0.0中已弃用的PercentFrameLayout。

以下是如何使用ConstraintLayout为布局保持1:1宽高比的示例:

 <android.support.constraint.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="0dp" android:layout_height="0dp" android:layout_marginEnd="0dp" android:layout_marginStart="0dp" android:layout_marginTop="0dp" android:background="@android:color/black" app:layout_constraintDimensionRatio="H,1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> </FrameLayout> </android.support.constraint.ConstraintLayout> 

或者不要编辑你的XML文件,你可以直接在布局编辑器中编辑你的布局:

布局编辑器

在你的build.gradle中添加:

 compile 'com.android.support:percent:23.1.1' 

并在你的layout.xml 包装任何视图或视图组,你要遵循一个PercentFrameLayout里面的比例 ,其中:

 android:layout_width="match_parent" android:layout_height="wrap_content" 

然后为视图或视图组要按照比例取代 android:layout_widthandroid:layout_height

  app:layout_aspectRatio="178%" app:layout_widthPercent="100%" 

并且您有一个视图或视图宽高比为16:9(1.78:1)的视图或视图,宽度匹配的父母和高度相应地调整。

注意:删除正常的宽度和高度属性很重要。 林特会抱怨,但它会工作。

您可以尝试最初将layout_height设置为wrap_content 。 但从那里我认为你必须进入代码。 只是为了尝试,在你的活动尝试像这样:

 @Override public void onResume(){ super.onResume(); findViewById(R.id.squareView).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { View squareView = findViewById(R.id.squareView); LayoutParams layout = squareView.getLayoutParams(); layout.height = squareView.getWidth(); squareView.setLayoutParams(layout); squareView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } }); } 

其中R.id.squareView是所讨论的视图的id 。 注意,这个代码被封装在onGlobalLayout调用中,以确保squareView.getWidth()具有有意义的值。

我为类似的用例创build了一个布局库。 随意使用它。

RatioLayouts

安装

将其添加到文件的顶部

 repositories { maven { url "http://dl.bintray.com/riteshakya037/maven" } } dependencies { compile 'com.ritesh:ratiolayout:1.0.0' } 

用法

在布局的根视图上定义'app'命名空间

 xmlns:app="http://schemas.android.com/apk/res-auto" 

将此库包含在您的布局中

 <com.ritesh.ratiolayout.RatioRelativeLayout android:id="@+id/activity_main_ratio_layout" android:layout_width="match_parent" android:layout_height="match_parent" app:fixed_attribute="WIDTH" // Fix one side of the layout app:horizontal_ratio="2" // ratio of 2:3 app:vertical_ratio="3"> 
 LinearLayout ll = (LinearLayout)findViewById(R.id.LL); int width = ll.getWidth(); LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(width, width); ll.setLayoutParams(ll_params); 

设置高度为fill_parent ,宽度为wrap_content

你用android:adjustViewBounds="true"修正长宽比