getWidth / Height () และ getMeasuredWidth / Height () ใน Android SDK ต่างกันอย่างไร


91

เอกสาร Android กล่าวว่ามีสองขนาดสำหรับมุมมองที่ขนาดวัดและมิติการวาดภาพ มิติที่วัดได้คือมิติที่คำนวณในการส่งผ่านการวัด ( วิธีการonMeasure ) ในขณะที่ขนาดที่วาดเป็นขนาดจริงบนหน้าจอ โดยเฉพาะเอกสารระบุว่า:

ค่าเหล่านี้อาจ แต่ไม่จำเป็นต้องแตกต่างจากความกว้างและความสูงที่วัดได้

คำถามของฉันคืออะไรทำให้มิติการวาดแตกต่างจากมิติที่วัดได้ ถ้าเมธอด onMeasure (int, int)ปฏิบัติตามข้อกำหนดโครงร่าง (กำหนดเป็นพารามิเตอร์widthMeasureSpecและheightMeasureSpec SDK จะตัดสินใจได้อย่างไรว่ามุมมองควรมีขนาดการวาดที่แตกต่างกัน

นอกจากนี้ซอร์สโค้ด Androidใช้ความกว้าง / ความสูงที่วัดได้อย่างไรในการคำนวณความกว้าง / ความสูงของรูปวาด ฉันพยายามที่จะดูซอร์สโค้ดดูแต่ฉันไม่สามารถเข้าใจได้ว่าความกว้าง / ความสูงที่วัดได้ถูกใช้เพื่อคำนวณความกว้าง / ความสูงสุดท้ายอย่างไร บางทีมันอาจจะมีบางอย่างเกี่ยวกับ padding แต่ฉันไม่แน่ใจ


ฉันคิดว่ามาตรการเหล่านี้อาจแตกต่างออกไปในกรณีที่มีการเพิ่มการเลื่อนลงในมุมมอง
Yury

บางที แต่ฉันได้พัฒนา ViewGroup ที่กำหนดเองและสิ่งนี้เกิดขึ้นในโค้ดของฉัน ฉันไม่ได้จัดการกับการเลื่อนจนกว่าจะถึงจุดที่พฤติกรรมนี้เกิดขึ้น ดังนั้นฉันคิดว่ามันควรจะมีอะไรมากกว่าการเลื่อนในเรื่องนี้
lgfischer

ฉันยืนยันว่าฉันเป็นผู้พัฒนา ViewGroup ที่กำหนดเองด้วยเช่นกันเพื่อบังคับอัตราส่วนกว้างยาวที่กำหนด: ฉันบังคับความกว้างและความสูงที่วัดได้ (ต่ำกว่าหรือเท่ากันแล้วตามที่เสนอ) แต่ฉันมีความกว้างและความสูงที่แท้จริงไม่เปลี่ยนแปลง (ไม่ใช่ค่าที่วัดได้) ไม่มีความสัมพันธ์กับการเลื่อน ฉันไม่สามารถหาวิธีบังคับความกว้างและความสูงที่แท้จริงได้
ARLabs

คำตอบ:


101

ตามชื่อที่แสดงให้เห็นความกว้าง / ความสูงที่วัดได้ถูกใช้ในระหว่างขั้นตอนการวัดและการจัดวาง

ขอยกตัวอย่าง

วิดเจ็ตถูกขอให้วัดตัวเองวิดเจ็ตบอกว่าต้องการเป็น 200px คูณ 200px นี่คือวัดความกว้าง / ความสูง

ระหว่างเฟสเค้าโครงกล่าวคือในเมธอด onLayout วิธีนี้สามารถใช้วัดความกว้าง / ความสูงของลูกหรือกำหนดความกว้าง / ความสูงใหม่โดยเรียกวิธีการจัดวางของมุมมอง

สมมติว่าเมธอด onLayout เรียก childview.layout (0,0,150,150) ตอนนี้ความกว้าง / ความสูงของมุมมองแตกต่างจากความกว้าง / ความสูงที่วัดได้

ฉันไม่แนะนำให้ใช้วิธีการวัดความกว้าง / ความสูงภายนอก onLayout

เพื่อสรุป

  1. onMeasure -> ตั้งค่า MeasureWidth / MeasureHeight
  2. onLayout -> ตั้งค่าความกว้าง / ความสูงของวิดเจ็ต

นอกจากนี้
public void View.layout(int l, int t, int r, int b)
ดูเหมือนว่าจะเป็นสถานที่ที่มีการกำหนดตำแหน่งและขนาดเกิดขึ้น


นั่นคือเราควรใช้ getWidth / getHeight เสมอเพื่อให้ได้มิติข้อมูล "จริง" ของ View ใช่ไหม?
suitianshi

1
ใช่ แต่ถ้าคุณกำลังทำเลย์เอาต์ของคุณเองคุณควรใช้ MeasureWidth แทนความกว้าง
Prakash Nadar

ดังนั้นจุดประสงค์ของการตั้งค่า dimesions ภายใน onMeasure () คืออะไร? ฉันหมายถึงเลย์เอาต์พาสเป็นแบบสุดท้ายที่คุณกำหนดขนาดสุดท้ายของมุมมองเป็นไปได้โดยไม่คำนึงถึงขนาดที่วัดได้
edoardotognoni

@edoardotognoni ขึ้นอยู่กับเค้าโครง (LinearLayout, RelativeLayout หรือเค้าโครงที่กำหนดเองของคุณ) เพื่อกำหนดขนาดและตำแหน่งที่ถูกต้องให้กับมุมมอง
Prakash Nadar

โอเคสมมติว่ามุมมองบอกว่า "ฉันต้องการมิติข้อมูลเหล่านี้" ในขณะที่เค้าโครงระบุว่า "คุณจะมีมิติข้อมูลเหล่านี้" อยู่ใช่ไหม?
edoardotognoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.