2012-09-07 36 views
22

Tôi đang cố gắng đặt chiều rộng của bố cục thành "fill_parent" trong khi có chiều cao của chế độ xem chỉ có cùng độ dài, để bố cục hình vuông.Cách đặt tỷ lệ khung hình cố định cho bố cục trong Android

Mọi đề xuất sẽ được đánh giá cao, cảm ơn trước! : D

+0

sử dụng wrap_content. Nó có cùng chiều rộng và chiều dài mà khung nhìn có. –

+0

trùng lặp có thể có của [Điền không gian còn lại với tỷ lệ khung hình cố định surfaceview] (http://stackoverflow.com/questions/10510371/fill-remaining-space-with-fixed-aspect-ratio-surfaceview) – Tim

+0

Tôi đã đấu tranh với chính bản thân mình cho một thời gian, và cuối cùng tôi quyết định tôi phải ghi đè lên onMeasure của khung nhìn mà tôi muốn hạn chế và thiết lập kích thước theo chương trình. Xem bản sao được liên kết. – Tim

Trả lời

18

Với sự giới thiệu của ConstraintLayout bạn không cần phải viết hoặc là một dòng mã hoặc sử dụng bên thứ ba hoặc dựa vào PercentFrameLayout đó đã bị phản đối ở 26.0.0.

Dưới đây là các ví dụ về làm thế nào để giữ cho tỉ lệ 1: 1 khía cạnh cho bố trí của bạn sử dụng 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> 

Hoặc thay vì chỉnh sửa tập tin XML, bạn có thể chỉnh sửa bố cục của bạn trực tiếp trong Layout Editor:

Layout Editor

+0

Xin chào @Eugene, bất cứ khi nào tôi sử dụng điều này để quay video, chiều rộng luôn luôn trông loại co giãn, những gì có thể có được nguyên nhân của pls này. –

+0

Chia sẻ ảnh chụp màn hình, vui lòng. –

+0

https://meshileya.github.io/error.png đó là ảnh chụp màn hình @Eugene Cảm ơn phản hồi của bạn. –

-1

bộ chiều cao như fill_parent, chiều rộng như wrap_content

và bạn khắc phục tỉ lệ với android:adjustViewBounds="true"

+0

AdjustViewBounds chỉ áp dụng cho ImageView, và nó hạn chế tỷ lệ của drawable, không phải là tỷ lệ của view. – Tim

+0

vì vậy bạn muốn tạo bố cục SQUARE? –

17

Bạn có thể thử ban đầu thiết lập các layout_height để wrap_content. Nhưng từ đó tôi nghĩ bạn phải đi vào mã. Chỉ cần thử nghiệm, trong hoạt động của bạn thử một cái gì đó như:

@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); 
     } 
    }); 
} 

đâu R.id.squareViewid về quan điểm trong câu hỏi. Và lưu ý, mã này được bao bọc trong cuộc gọi onGlobalLayout để đảm bảo rằng squareView.getWidth() có giá trị có ý nghĩa.

+0

Nó hoạt động! cảm ơn bạn rất nhiều! – Bolton

+0

'removeGlobalOnLayoutListener' không được chấp nhận. sử dụng '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

Điều này là ít nhiều OK, tuy nhiên tất cả phụ thuộc vào * khi * nó được gọi. Ví dụ: nếu bạn đã đặt mã này trong onCreate, ll.getWidth() sẽ trả về 0. – newbyca

19

Trong build.gradle bạn add:

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

và bạn Layout.xmlbọc bất cứ điều gì xem hoặc ViewGroup bạn muốn đi theo một tỷ lệ bên trong một PercentFrameLayout nơi:

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

và sau đó để xem hoặc ViewGroup bạn muốn đi theo một tỷ lệ thayandroid: layout_widthandroid: layout_height:

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

và bạn có một cái nhìn hoặc ViewGroup nơi tỉ lệ khung hình là 16: 9 (1,78: 1) với chiều rộng phù hợp với phụ huynh và chiều cao được điều chỉnh cho phù hợp.

Lưu ý: Điều quan trọng là bạn phải loại bỏ các thuộc tính chiều rộng và chiều cao bình thường. Lint sẽ phàn nàn, nhưng nó sẽ hoạt động.

+1

Tôi đồng ý với mọi thứ được nêu ở đây ngoại trừ việc loại bỏ các thuộc tính chiều rộng và chiều cao bình thường mà bạn đã đề cập là quan trọng. Tôi đã thử nó và nó không hiệu quả với tôi. Thay vào đó, tôi phải đặt chúng thành android sau đây: layout_width = "0dp" android: layout_height = "0dp" như được mô tả ở đây: http://stackoverflow.com/questions/34931023/percentframelayout-you-must-supply-a- layout-width-attribute –

+0

Cảnh báo: điều này sẽ chỉ hoạt động nếu chiều rộng container> = chiều cao container * 16/9. Ví dụ: nếu chiều rộng vùng chứa của bạn là 1000dp và chiều cao của nó là 50dp, con của bạn sẽ vừa với chiều rộng và có chiều cao là 1000 * 9/16 = 562,5. –

+1

'PercentRelativeLayout' và' PercentFrameLayout' hiện không còn được dùng nữa và đề xuất sử dụng 'ConstraintLayout' thay thế. –

2

Tôi đã tạo thư viện bố cục cho trường hợp sử dụng tương tự. Hãy sử dụng nó.

RatioLayouts

Lắp đặt

Thêm phần này vào phía trên cùng của tập tin

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


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

Cách sử dụng

Xác định không gian tên 'ứng dụng' vào xem gốc trong cách bố trí của bạn

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

Bao gồm thư viện này trong cách bố trí của bạn

<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"> 
Các vấn đề liên quan