44

ビューの高さを同じ長さにしながら、レイアウトの幅を「fill_parent」に設定して、レイアウトを正方形にしようとしています。

事前に感謝します、どんな提案でもありがたいです!:D

4

8 に答える 8

103

ConstraintLayoutの導入により、1行のコードを記述したり、サードパーティを使用したりPercentFrameLayout、26.0.0で非推奨になったサードパーティに依存したりする必要がなくなりました。

以下を使用して、レイアウトのアスペクト比を1:1に保つ方法の例を次に示しますConstraintLayout

<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ファイルを編集する代わりに、レイアウトエディタでレイアウトを直接編集できます。

レイアウトエディタ

于 2017-08-30T15:35:51.173 に答える
22

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)で、幅が親に一致し、高さがそれに応じて調整されているビューまたはビューグループがあります。

注:通常の幅と高さのプロパティを削除することが重要です。リントは文句を言うでしょう、しかしそれはうまくいくでしょう。

于 2016-02-10T11:58:14.573 に答える
17

最初にをに設定してみ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()

于 2012-09-07T03:43:47.887 に答える
6

同様のユースケースのレイアウトライブラリを作成しました。お気軽にご利用ください。

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">
于 2017-05-30T06:49:15.767 に答える
0
LinearLayout ll = (LinearLayout)findViewById(R.id.LL);


int width = ll.getWidth();
LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(width, width);
ll.setLayoutParams(ll_params);
于 2012-09-07T03:49:46.967 に答える
0
 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);
于 2018-05-09T07:55:50.683 に答える
0

アスペクト比を維持する必要があり、親レイアウトを「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>

ここに画像の説明を入力してください

于 2020-09-16T08:31:28.227 に答える
-1

高さをfill_parent、幅をとして設定しますwrap_content

アスペクト比を次のように修正しますandroid:adjustViewBounds="true"

于 2012-09-07T03:38:31.177 に答える