onMeasure()
là cơ hội của bạn để nói với Android mức độ lớn mà bạn muốn chế độ xem tùy chỉnh của mình phụ thuộc vào các ràng buộc bố cục do phụ huynh cung cấp; đó cũng là cơ hội của chế độ xem tùy chỉnh của bạn để tìm hiểu những hạn chế bố cục đó là gì (trong trường hợp bạn muốn hành xử khác trong match_parent
tình huống hơn là wrap_content
tình huống). Các ràng buộc này được đóng gói thành các MeasureSpec
giá trị được truyền vào phương thức. Đây là một mối tương quan sơ bộ của các giá trị chế độ:
- Chính xác có nghĩa là
layout_width
hoặc layout_height
giá trị được đặt thành một giá trị cụ thể. Bạn có lẽ nên làm cho quan điểm của bạn kích thước này. Điều này cũng có thể được kích hoạt khi match_parent
được sử dụng, để đặt kích thước chính xác cho chế độ xem chính (đây là bố cục phụ thuộc trong khung).
- AT_MOST thường có nghĩa là
layout_width
hoặc layout_height
giá trị được đặt thành match_parent
hoặc wrap_content
khi cần kích thước tối đa (đây là bố cục phụ thuộc trong khung) và kích thước của kích thước cha là giá trị. Bạn không nên lớn hơn kích thước này.
- UNSPECifyED thường có nghĩa là
layout_width
hoặc layout_height
giá trị được đặt thành wrap_content
không có giới hạn. Bạn có thể là bất cứ kích thước nào bạn muốn. Một số bố cục cũng sử dụng cuộc gọi lại này để tìm ra kích thước mong muốn của bạn trước khi xác định thông số kỹ thuật nào thực sự vượt qua bạn trong yêu cầu đo thứ hai.
Hợp đồng tồn tại với onMeasure()
đó là setMeasuredDimension()
PHẢI được gọi ở cuối với kích thước bạn muốn có. Phương thức này được gọi bởi tất cả các triển khai khung, bao gồm cả triển khai mặc định được tìm thấy View
, đó là lý do tại sao nó an toàn để gọi super
thay thế nếu phù hợp với trường hợp sử dụng của bạn.
Cấp, bởi vì khung áp dụng triển khai mặc định, bạn có thể không cần ghi đè phương thức này, nhưng bạn có thể thấy cắt trong trường hợp không gian xem nhỏ hơn nội dung của bạn nếu bạn không và nếu bạn bố trí Chế độ xem tùy chỉnh với wrap_content
cả hai hướng, chế độ xem của bạn hoàn toàn không hiển thị vì khung không biết nó lớn đến mức nào!
Nói chung, nếu bạn đang ghi đè View
và không phải là một tiện ích hiện có khác, có lẽ nên cung cấp một triển khai, ngay cả khi nó đơn giản như một thứ như thế này:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
Mong rằng sẽ giúp.