onMeasure()
เป็นโอกาสของคุณที่จะบอก Android ว่าคุณต้องการให้มุมมองที่กำหนดเองของคุณใหญ่เพียงใดขึ้นอยู่กับข้อ จำกัด ของเลย์เอาต์ที่ผู้ปกครองจัดหาให้ นอกจากนี้ยังเป็นโอกาสในมุมมองที่กำหนดเองของคุณเพื่อเรียนรู้ว่าข้อ จำกัด ของเลย์เอาต์เหล่านั้นคืออะไร (ในกรณีที่คุณต้องการทำงานในmatch_parent
สถานการณ์ที่แตกต่างจากwrap_content
สถานการณ์) ข้อ จำกัด เหล่านี้ถูกรวมเป็นMeasureSpec
ค่าที่ส่งผ่านไปยังเมธอด นี่คือความสัมพันธ์คร่าวๆของค่าโหมด:
- แน่นอนหมายความว่าค่า
layout_width
หรือlayout_height
ถูกตั้งค่าเป็นค่าที่เฉพาะเจาะจง คุณควรทำให้ขนาดของคุณดู สิ่งนี้ยังสามารถถูกทริกเกอร์เมื่อmatch_parent
ใช้เพื่อตั้งขนาดให้ตรงกับมุมมองพาเรนต์ (นี่คือโครงร่างที่ขึ้นอยู่กับกรอบงาน)
- AT_MOSTมักจะหมายถึง
layout_width
หรือlayout_height
ค่าถูกกำหนดให้match_parent
หรือwrap_content
ที่มีขนาดสูงสุดเป็นสิ่งจำเป็น (นี้จะขึ้นอยู่ในกรอบรูปแบบ) และขนาดของมิติที่ผู้ปกครองเป็นค่า คุณไม่ควรใหญ่กว่าขนาดนี้
- โดยทั่วไปUNSPECIFIEDหมายถึงการตั้งค่า
layout_width
หรือlayout_height
ค่าเป็นwrap_content
ไม่มีข้อ จำกัด คุณสามารถเป็นอะไรก็ได้ที่คุณต้องการ บางเลย์เอาต์ใช้การเรียกกลับนี้เพื่อหาขนาดที่คุณต้องการก่อนกำหนดรายละเอียดที่จะส่งให้คุณอีกครั้งในคำขอวัดครั้งที่สอง
สัญญาที่มีอยู่onMeasure()
คือsetMeasuredDimension()
ต้องเรียกท้ายที่สุดด้วยขนาดที่คุณต้องการให้เป็นมุมมอง เมธอดนี้ถูกเรียกใช้โดยการประยุกต์ใช้เฟรมเวิร์กทั้งหมดรวมถึงการใช้งานเริ่มต้นที่พบView
ซึ่งเป็นเหตุผลว่าทำไมจึงปลอดภัยที่จะโทรออกsuper
หากเหมาะสมกับกรณีการใช้งานของคุณ
ได้รับเนื่องจากเฟรมเวิร์กใช้การใช้งานเริ่มต้นจึงไม่จำเป็นสำหรับคุณที่จะแทนที่วิธีนี้ แต่คุณอาจเห็นการตัดในกรณีที่พื้นที่ดูมีขนาดเล็กกว่าเนื้อหาของคุณถ้าคุณไม่ทำและถ้าคุณวางโครงร่างของคุณ มุมมองที่กำหนดเองด้วยwrap_content
ทั้งสองทิศทางมุมมองของคุณอาจไม่ปรากฏเลยเพราะกรอบงานไม่ทราบว่ามีขนาดใหญ่เพียงใด!
โดยทั่วไปหากคุณกำลังเอาชนะView
และไม่ใช่วิดเจ็ตอื่นที่มีอยู่มันอาจเป็นความคิดที่ดีที่จะให้การใช้งานแม้ว่ามันจะง่ายเหมือนอย่างนี้:
@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);
}
หวังว่าจะช่วย