2016-11-24 23 views
7

Trong ứng dụng của tôi, tôi có chế độ xem cuộn. Trong suốt quá trình sử dụng ứng dụng của tôi, tôi tự động thêm chế độ xem mới vào chế độ xem cuộn. Tôi có thể thêm các quan điểm với vấn đề nhỏ, tuy nhiên tôi không thể có được kích thước đúng. Dưới đây là một phác thảo bố cục mong muốn của tôi:Cách làm nổi bật chế độ xem mở rộng với chế độ xem tỷ lệ khung hình cố định

enter image description here

Trong hình ảnh Tôi có một màn hình với kích thước Width bởi Height. Nó có chứa một số HorizontalScrollView (hoặc có thể là RecyclerView nhưng tôi không biết cách sử dụng cái này) sẽ tăng lên khi lượt xem được thêm vào nó. Tôi muốn mỗi mục được thêm vào chế độ xem để có chiều rộng bằng 1/5 chiều cao màn hình và có chiều cao phù hợp. Tôi có thể làm cho công việc này nếu tôi hardcode chiều rộng của xem thổi phồng, tuy nhiên, xem của tôi sẽ không có tỷ lệ tương tự trên tất cả các điện thoại.

Lưu ý: Tôi đã thử sử dụng PercentRelativeLayout, nhưng tôi không thể làm cho nó hoạt động. Bạn không chắc chắn cách giải quyết vấn đề này ... bất kỳ ý tưởng nào?


Lưu ý về bounty: Tôi sẽ chấp nhận câu trả lời có trong Java hoặc C# (Xamarin) !! Dự án của tôi là ở Xamarin nên nó sẽ tốt đẹp nếu nó hoạt động cho điều đó, hoặc nếu nó có thể dễ dàng thích nghi để làm việc trong C#

+0

Nó thực sự phụ thuộc vào có hay không các kích thước là động hoặc cố định. Nếu chúng được cố định, bạn có thể mã hóa các thứ nguyên trong bố cục và chỉ sử dụng các ghi đè dpi khác nhau để thay đổi kích thước của thứ nguyên. Nếu bạn cần kích thước động, thì tôi cũng có thể trả lời, nhưng xem bạn có thể quản lý kích thước đó bằng bố cục & kích thước xml trước không. Ngoài ra, tôi khuyên bạn nên xem xét sử dụng RecylerView. Đó là một chút để quấn đầu của bạn xung quanh, nhưng cung cấp tính linh hoạt và kiểm soát nhiều hơn nữa. Đây là cách bạn có thể thực hiện theo chiều ngang: http://stackoverflow.com/a/28460399/1740059 –

+0

@JustinMitchell tỷ lệ sẽ không đổi, tốt nhất được xác định trong xml dưới dạng phần trăm. Tôi đã thử chế độ xem tùy chỉnh ghi đè kích thước, nhưng tôi không thể làm cho nó hoạt động mà không làm hỏng kích thước cho chế độ xem con của nó. – flakes

+0

Không sử dụng tỷ lệ phần trăm, sử dụng giá trị dp cố định. Tuy nhiên, bạn vẫn có thể thay đổi kích thước chế độ xem trên phương thức onCreateView. Hãy chắc chắn rằng bạn tạo một người quan sát lắng nghe các sửa đổi của chế độ xem dạng cây để bạn có thể có được thứ nguyên chế độ xem thực, nếu không kích thước sẽ bị tắt. –

Trả lời

4

Bạn không muốn xem thứ năm của chiều cao màn hình, bạn muốn nó một phần năm chiều cao của chế độ xem gốc. Hoặc là hoàn toàn chính xác, bạn muốn chiều rộng của bạn là một phần năm chiều cao của khung nhìn.

Sự khác biệt là việc sử dụng chiều rộng/chiều cao của màn hình có thể hoạt động trên thiết bị của bạn nhưng lại phá vỡ các thiết bị khác. Bạn sẽ làm gì nếu ai đó mở ứng dụng của bạn bằng màn hình chia tách?

Tuy nhiên định nghĩa về kích thước tầm nhìn của bạn, cách tiếp cận là như nhau: Nếu bạn muốn có một Xem rằng sau một số quy tắc bạn sẽ phải tạo riêng của bạn và đo tầm nhìn của bạn cho phù hợp.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int availableHeight = MeasureSpec.getSize(heightMeasureSpec); 
    int wantedWidth = availableHeight/5; 

    setMeasuredDimension(wantedWidth, availableHeight); 
} 

Và đó là cơ bản. Bạn có thể muốn đọc tài liệu thích hợp về MeasureSpec và đo lường lượt xem nói chung. Tôi cũng đã viết một bài đăng blog về custom views bao gồm một số khái niệm cơ bản.

Sau đó, bạn có thể thêm chế độ xem tùy chỉnh của mình vào LinearLayout sao lưu ScrollView và bạn đã đặt.

Đây là mẫu đầy đủ sẽ về cơ bản hoạt động, bạn có thể muốn sử dụng thứ gì đó khác với bố cục khung.

public class FifthWidthView extends FrameLayout { 
    public FifthWidthView(Context context) { 
    super(context); 
    } 

    public FifthWidthView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    public FifthWidthView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int availableHeight = MeasureSpec.getSize(heightMeasureSpec); 
     int wantedWidth = availableHeight/5; 

     setMeasuredDimension(wantedWidth, availableHeight); 
    } 
} 
+0

Sẽ cố gắng này vào ngày mai và lấy lại cho bạn :) Tôi có thể sẽ làm cho một thuộc tính bố trí để thiết lập tỷ lệ phần trăm chính xác. Điều này sẽ làm việc với một cái nhìn lồng nhau? – flakes

+0

@flakes Với cách tiếp cận này, bạn nên sử dụng thuộc tính xem để sửa đổi tỷ lệ. Chỉ cần bọc các khung nhìn bạn thêm vào LinearLayout (trong scrollview) với bố trí đã cho. Để sử dụng thuộc tính layout, bạn phải triển khai ViewGroup của riêng bạn và thực hiện bố cục để các thuộc tính có hiệu lực, đó là cách tiếp cận khác (cũng hợp lệ), nhưng nỗ lực nhiều hơn một chút) –

2

giả sử bạn có thể sử dụng ViewPager. nếu vậy, bạn sẽ cần ghi đè phương thức getPageWidth(). Phương thức này cho người xem biết độ rộng của mỗi khung nhìn bên trong nó, từ 0 (không có gì) đến 1 (sử dụng tất cả).

Chúng tôi sẽ tính toán kích thước động nếu có thể, lấy trong tâm trí chúng ta muốn sử dụng nhiều chỉ là một chút của một phần ba màn hình. Giả sử bạn muốn sử dụng toàn bộ màn hình cho các bộ sưu tập chỉ với một phần tử, một nửa màn hình cho các bộ sưu tập có hai phần tử và tính toán động cho mọi phần tử khác.

@Override 
public float getPageWidth(int position) { 

     try{ 
      Paint paint = new Paint(); 
      return 0.3f+paint.measureText(data.get(position).getSize())/ DeviceFunctions.giveScreenResolution((Activity) context).x; 
     } 
     catch(Exception e){ 

      int size = data.getValues().size(); 
      switch(size){ 

       case 1: return 1.f; 
       case 2: return 0.5f; 
       case 3: return 0.33f; 
       default: return 0.33f; 
      } 
     } 
    } 

chúng tôi giả định:

-the thu thập dữ liệu cho phép bạn để phát hiện chiều rộng dự định tầm nhìn của bạn. Bạn có thể thay đổi điều này với bất kỳ tham chiếu nào bạn muốn. Hoặc bạn có thể cho một kích thước cố định dựa trên vị trí của điểm:

@Override 
public float getPageWidth(int position) { 

      int size = data.getValues().size(); 
       switch(size){ 

        case 1: return 0.35f; 
        case 2: return 0.35f; 
        case 3: return 0.30f; 
        default: return 0.33f; 
       } 
     } 

Và để nhận được độ phân giải màn hình:

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
    public static Point giveScreenResolution(Activity activity){ 

     Display display = activity.getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     return size; 
    } 
1

Trong một trong những ứng dụng của tôi sử dụng đoạn mã này và làm việc hoàn toàn tốt đẹp.

public static int getScreenHeight(Activity context) 
     { 
      Display display = context.getWindowManager().getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 
      int height = size.y; 
      return height; 
     } 

Trong Hoạt động của tôi đang sử dụng mã dưới đây

//Container layout may be child of HorizontalScrollView 
LinearLayout parent = (LinearLayout)findViewById(R.id.splash_screen_logo); 
//Child layout to be added 
View mychildview = getLayoutInflater().inflate((R.layout.childView); 
mychildview.getLayoutParams().width = Utils.getScreenHeight(this)/5; 
mychildview.getLayoutParams().height = Utils.getScreenHeight(this); 
parent.addview(mychildview) 
Các vấn đề liên quan