Sự khác biệt giữa getWidth / Height () và getMeasuredWidth / Height () trong Android SDK là gì?


88

Các tài liệu Android nói rằng có hai kích thước cho một cái nhìn, các kích thước đokích thước bản vẽ . Kích thước đo được là kích thước được tính trong đường truyền đo ( phương pháp onMeasure ), trong khi kích thước bản vẽ là kích thước thực trên màn hình. Đặc biệt, tài liệu nói rằng:

Các giá trị này có thể, nhưng không nhất thiết phải khác với chiều rộng và chiều cao đã đo.

Vì vậy, câu hỏi của tôi là: điều gì có thể làm cho kích thước bản vẽ khác với kích thước đo được? Nếu phương thức onMeasure (int, int) tôn trọng các yêu cầu về bố cục (được đưa ra dưới dạng các tham số widthMeasureSpecheightMeasureSpec , làm cách nào SDK có thể quyết định rằng chế độ xem phải có kích thước bản vẽ khác?

Ngoài ra, làm thế nào / ở đâu trong Mã nguồn Android , chiều rộng / chiều cao đo được được sử dụng để tính chiều rộng / chiều cao của bản vẽ? Tôi đã cố gắng xem xét mã nguồn View , nhưng tôi không thể tìm ra cách sử dụng Chiều rộng / Chiều cao đo được để tính chiều rộng / chiều cao cuối cùng. Có thể nó có liên quan gì đó đến phần đệm, nhưng tôi không chắc.


Tôi nghĩ rằng các biện pháp này có thể khác trong trường hợp nếu một cuộn được thêm vào chế độ xem.
Yury

Có thể, nhưng tôi đã phát triển một ViewGroup tùy chỉnh và điều này đang xảy ra trong mã của tôi. Tôi sẽ không xử lý cuộn cho đến khi hành vi này xảy ra. Vì vậy, tôi nghĩ rằng cần phải có nhiều hơn cuộn liên quan đến điều này.
lgfischer

Tôi xác nhận, tôi cũng phát triển một ViewGroup tùy chỉnh để ép buộc một tỷ lệ khung hình nhất định: tôi đã buộc chiều rộng và chiều cao đo được (thấp hơn hoặc bằng sau đó được đề xuất), nhưng kết quả là chiều rộng và chiều cao thực không thay đổi (không phải là những thứ được đo). Không liên quan đến cuộn. Tôi thực sự không thể tìm ra cách để buộc chiều rộng và chiều cao thực sự.
ARLabs

Câu trả lời:


96

Như tên cho thấy Chiều rộng / chiều cao đo được được sử dụng trong giai đoạn đo và bố trí.

Để tôi lấy một ví dụ,

Một tiện ích được yêu cầu tự đo lường, Tiện ích nói rằng nó muốn có kích thước 200px x 200px. Đây là chiều rộng / chiều cao được đo.

Trong giai đoạn bố trí, tức là trong phương thức onLayout. Phương thức có thể sử dụng Chiều rộng / chiều cao đo được của các con của nó hoặc gán chiều rộng / chiều cao mới bằng cách gọi phương thức bố cục của khung nhìn.

giả sử phương thức onLayout gọi childview.layout (0,0,150,150) bây giờ chiều rộng / chiều cao của chế độ xem khác với chiều rộng / chiều cao đo được.

Tôi khuyên bạn không nên sử dụng chiều rộng / chiều cao đo được bên ngoài phương pháp onLayout.

để tóm tắt.

  1. onMeasure -> thiết lập đo Chiều rộng / Đo chiều cao
  2. onLayout -> thiết lập chiều rộng / chiều cao của tiện ích.

additionallly
public void View.layout(int l, int t, int r, int b)
dường như là nơi xảy ra sự phân công vị trí và quy mô.


nghĩa là, chúng ta nên luôn sử dụng getWidth / getHeight để lấy thứ nguyên "thực" của một View, phải không?
suitianshi

1
Có, nhưng nếu bạn đang thực hiện bố cục của riêng mình thì bạn nên sử dụng Chiều rộng đo được thay vì Chiều rộng.
Prakash Nadar

Vì vậy, mục đích của việc thiết lập số lượng bên trong onMeasure () là gì? Ý tôi là, đèo bố trí là người cuối cùng, trong đó bạn thiết lập kích thước cuối cùng của xem, possibliy bất kể kích thước đo
edoardotognoni

@edoardotognoni nó phụ thuộc vào bố cục (LinearLayout, RelativeLayout hoặc bố cục tùy chỉnh của bạn), để cung cấp kích thước và vị trí chính xác cho chế độ xem.
Prakash Nadar

Ok, giả sử chế độ xem cho biết "Tôi muốn các kích thước này". Trong khi bố cục cho biết "Bạn sẽ có các kích thước này". Đúng không?
edoardotognoni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.