7

Tôi có một số bố trí lồng nhau mà tôi đang cố gắng xoay 90 độ theo yêu cầu trong mã. Tôi đã có một phần setRotation của những thứ làm việc tốt, nhưng tiếc là mọi thứ không thay đổi kích thước khá đúng với vòng quay. Chiều rộng trên các phần tử này được đặt thành match_parent và sau khi xoay nó vẫn khớp với chiều rộng gốc, không phải chiều cao gốc mà nó phải khớp.Làm cách nào để làm mới match_parent trong linearLayout sau khi sử dụng setRotation?

XML

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mainLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="link.basiclifecounter.LifeCounter" 
    android:background="#CC00CC"> 

    <LinearLayout 
     android:id="@+id/topPlayers" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:orientation="vertical" 
     android:background="#CC0000"> 

     <RelativeLayout 
      android:id="@+id/p3" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"> 

     **A bunch of stuff in here** 

     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/p2" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"> 

     **A bunch of stuff in here** 

     </RelativeLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottomPlayer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" 
     android:background="#00CC00"> 

     <RelativeLayout 
      android:id="@+id/p1" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"> 

     **A bunch of stuff in here** 

     </RelativeLayout> 
    </LinearLayout> 
</LinearLayout> 

Rotation Java Mã

view.findViewById(R.id.topPlayers).setRotation(90); //Rotate the entire top box 
view.findViewById(R.id.p3).setRotation(180); //Flip one side so both players face outwards 

This picture cho thấy hình ảnh trước khi luân chuyển xảy ra.

This picture hiển thị hình ảnh sau khi xoay vòng xảy ra.

Như bạn có thể thấy, toàn bộ hộp đã được xoay sau khi chiều cao và chiều rộng của nó đã được đặt. Trong phiên bản không được bảo vệ, chiều rộng (match_parent) phải ở chế độ toàn màn hình và chiều cao (layout_weight = 2) phải bằng 2/3 màn hình. Điều đó hoạt động tốt. Vấn đề là sau khi nó quay, những kích thước đó vẫn giữ nguyên thay vì thích ứng và thay đổi sang vòng quay mới.

Tôi đã ném một số màu nền sáng để giúp khắc phục sự cố, Màu hồng mà bạn đang nhìn thấy nằm trong LinearLayout chính, không nằm trong bất kỳ bố cục nào được xoay.

Tôi đã thử bao gồm xoay trong chính xml, thay vì bên trong mã và nhận được kết quả chính xác giống như hình sau, vì vậy rõ ràng điều gì đó tôi không hiểu về cách có chiều rộng bố cục theo cách Tôi muốn. Tôi có thể không sử dụng layout_weight một cách hiệu quả với luân phiên không?

+0

Đối với những gì nó có giá trị Tôi chưa bao giờ giải quyết việc này.Tôi đã kết thúc việc tạo các tệp XML riêng biệt cho có và không có vòng xoay và sử dụng VerticalTextView tùy chỉnh như được đề xuất [ở đây] (http://stackoverflow.com/questions/1258275/vertical-rotated-label-in-android) để lấy văn bản của tôi để xoay. Làm việc như một sự quyến rũ, ngay cả khi các tập tin xml nhiều là một chút clunkier hơn một vòng quay đơn giản sẽ có được. –

+0

Tôi chưa (có) có câu trả lời hay, nhưng tôi nghĩ điều này có thể đạt được bằng cách nhận được kích thước của cha mẹ của chế độ xem và đặt thứ nguyên của chế độ xem cho phù hợp. I.e., 'int width = ((Xem) myView.getParent()) getWidth();', 'myView.setLayoutParams (new FrameLayout.LayoutParams (chiều rộng, chiều cao));'. Tuy nhiên, tôi có một số vấn đề với vị trí, nhưng tôi nghĩ rằng tôi có thể vượt qua những vấn đề đó với một số kết hợp của 'setPivotX()' và 'setX()'. – VinceFior

+0

Hoán đổi giá trị độ cao và trọng số của thông số bố cục và đặt lại thông số bố cục của chế độ xem khi bạn xoay. –

Trả lời

1

Tôi nghĩ rằng bạn đang gặp vấn đề tương tự như được nêu trong Stack Overflow question này. Có vẻ như việc xoay vòng chỉ đơn giản là không tính đến các mục đích bố trí. Nói cách khác, bố trí xảy ra sau đó xoay vòng xảy ra với các khung nhìn như được trình bày trước khi quay.

Điều này answer cho cùng một câu hỏi đó có thể giúp bạn.

Bạn cũng có thể điều chỉnh các phép đo theo cách thủ công. Dù bằng cách nào là một chút lộn xộn, nhưng tôi nghĩ rằng đó là cách nó được.


Bạn có thể tải bố cục thay thế sẽ hoạt động như bạn muốn thay vì thực hiện xoay vòng. (Xem bố trí và hình ảnh bên dưới.) Bạn cũng có thể đạt được kết quả tương tự bằng cách thay đổi các tham số bố cục theo lập trình.

Dưới đây là một số project on GitHub thể hiện việc xoay vòng theo chương trình. Chế độ xem xoay sau khi tạm dừng ba giây.

Tôi hy vọng bạn thấy điều này hữu ích.

enter image description here

alternate.xml

<LinearLayout 
     android:id="@+id/topPlayers" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:background="#CC0000" 
     android:orientation="horizontal"> 

     <RelativeLayout 
      android:id="@+id/p3" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical" 
      android:rotation="90"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="p3" 
       android:textSize="48sp" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/p2" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:background="#0000CC" 
      android:gravity="center" 
      android:orientation="vertical"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:rotation="-90" 
       android:text="p2" 
       android:textSize="48sp" /> 
     </RelativeLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottomPlayer" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="#00CC00" 
     android:orientation="vertical"> 

     <RelativeLayout 
      android:id="@+id/p1" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:gravity="center" 
      android:orientation="vertical"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="p1" 
       android:textSize="48sp" /> 
     </RelativeLayout> 
    </LinearLayout> 

Các vấn đề liên quan