2012-09-07 92 views
22

我想將佈局的寬度設置爲「fill_parent」,同時使視圖的高度只有相同的長度,以使佈局成爲正方形。如何在Android中爲佈局設置固定縱橫比

任何建議將不勝感激,提前致謝! :d

+0

使用wrap_content。它採用與視圖相同的寬度和長度。 –

+0

可能的重複[填充剩餘空間與固定長寬比surfaceview](http://stackoverflow.com/questions/10510371/fill-remaining-space-with-fixed-aspect-ratio-surfaceview) – Tim

+0

我掙扎着這與我自己一會兒,最終我決定我必須重寫我想以編程方式約束和設置尺寸的視圖的onMeasure。查看鏈接的副本。 – Tim

回答

18

隨着引進ConstraintLayout你不用編寫任何代碼一個單一的線,或者使用第三方或依賴PercentFrameLayout這是在26.0.0棄用。

下面是如何保持1中的例子:1寬高比使用ConstraintLayout佈局:編輯XML文件

<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> 

或替代的,你可以直接在佈局編輯器編輯您的佈局:

Layout Editor

+0

你好@Eugene,無論何時我用它來捕捉視頻,寬度總是看起來有點有彈性,這可能是導致這種情況的原因。 –

+0

請分享截圖。 –

+0

https://meshileya.github.io/error.png那是截圖@Eugene 感謝您的回覆。 –

-1

一套高度fill_parent,寬度爲wrap_content

,你修復與android:adjustViewBounds="true"

+0

AdjustViewBounds僅適用於ImageView,它約束了drawable的比率,而不是視圖的比率。 – Tim

+0

所以你想讓佈局SQUARE? –

17

長寬比你可以嘗試最初設定layout_heightwrap_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()具有有意義的值。

+0

它的工作原理!非常感謝! – Bolton

+0

'removeGlobalOnLayoutListener'已棄用。使用'removeOnGlobalLayoutListener(...)' – Aks4125

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); 
+1

這或多或少都可以,但是它全部取決於調用它時的*。例如,如果您要將此代碼放在onCreate中,ll.getWidth()將返回0. – newbyca

19

在你的build.gradle地址:

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

,並在您layout.xml包裝任何視圖或ViewGroup中要遵循一個PercentFrameLayout其中裏面的比例:

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

然後查看或的ViewGroup要遵循的比率替換機器人:layout_width機器人:layout_height

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

和你有一個視圖或ViewGroup中,其中寬高比爲16:9(1.78:1)寬度匹配父母和高度相應地調整。

注意:刪除正常的寬度和高度屬性很重要。林特會抱怨,但它會工作。

+1

我同意這裏所說的一切,除非要刪除您提到的正常寬度和高度屬性,這一點非常重要。我已經嘗試過了,但它不適合我。相反,我不得不將它們設置爲以下android:layout_width =「0dp」 android:layout_height =「0dp」如下所述:http://stackoverflow.com/questions/34931023/percentframelayout-you-must-supply-a- layout-width-attribute –

+0

警告:只有容器寬度> =容器高度* 16/9時,這纔會起作用。例如,如果您的容器寬度爲1000dp,高度爲50dp,則您的孩子將適合寬度並且高度爲1000 * 9/16 = 562.5。 –

+1

'PercentRelativeLayout'和'PercentFrameLayout'現在已被棄用,建議使用'ConstraintLayout'代替。 –

2

我爲類似用例創建了一個佈局庫。隨意使用它。

RatioLayouts

安裝

這個添加到文件的頂部

repositories { 
    maven { 
     url "http://dl.bintray.com/riteshakya037/maven" 
    } 
} 


dependencies { 
    compile 'com.ritesh:ratiolayout:1.0.0' 
} 

使用

定義在佈局上根視圖 '應用' 命名空間

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"> 
相關問題