如何在Android中设置布局的固定纵横比

zpjtge22  于 2022-12-31  发布在  Android
关注(0)|答案(8)|浏览(170)

我试图将布局的宽度设置为“fill_parent”,同时使视图的高度保持相同的长度,使布局成为正方形。
如有任何建议,我们将不胜感激。

ou6hu8tu

ou6hu8tu1#

随着ConstraintLayout的引入,您不必编写任何一行代码,也不必使用第三方或依赖于PercentFrameLayout,后者在26.0.0中已被弃用。
以下是如何使用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文件:

5vf7fwbs

5vf7fwbs2#

在您的 build.gradle 中添加:

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

并在您的 * layout.xml*wrap任何视图或视图组中遵循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)的视图或视图组,其宽度与父视图匹配,高度也相应调整。
注意:删除正常的宽度和高度属性是很重要的。棉绒会抱怨,但它会工作。

7lrncoxx

7lrncoxx3#

您可以尝试将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。注意,此代码被 Package 在onGlobalLayout调用中,以确保squareView.getWidth()具有有意义的值。

pvabu6sv

pvabu6sv4#

我创建了一个布局库类似的用例。请随意使用它。
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">
ccgok5k5

ccgok5k55#

如果您想保留纵横比并且父布局必须是“wrap_content”(对于包含可变文本的文本视图很有用),您可以添加一个伪视图,它将保留纵横比,并且其他元素必须约束到该视图:

<androidx.constraintlayout.widget.ConstraintLayout     
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <View
        android:id="@+id/ratio_constraint"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintDimensionRatio="122:246"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="@id/ratio_constraint"
        app:layout_constraintStart_toStartOf="@id/ratio_constraint"
        app:layout_constraintTop_toTopOf="@id/ratio_constraint"
        tools:text="The TextView which can extend the layout" />

  </androidx.constraintlayout.widget.ConstraintLayout>

omvjsjqw

omvjsjqw6#

LinearLayout ll = (LinearLayout)findViewById(R.id.LL);

int width = ll.getWidth();
LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(width, width);
ll.setLayoutParams(ll_params);
uklbhaso

uklbhaso7#

final RelativeLayout rlMyList = findViewById(R.id.rlMyList);
 rlMyList.postDelayed(new Runnable() {
     @Override
     public void run() {
          int width = rlMyList.getWidth();
          LayoutParams lp = (LayoutParams) rlMyList.getLayoutParams();
          lp.width = width;
          lp.height = (int) (width * 0.67);// in my case ratio 3:2
          rlMyList.setLayoutParams(lp);
     }
 },500);
bfrts1fy

bfrts1fy8#

设置高度为fill_parent,宽度为wrap_content
然后用android:adjustViewBounds="true"固定纵横比

相关问题