ฉันต้องการกำหนดลำดับ z ของมุมมองของ RelativeLayout ใน Android
bringToFront
ฉันรู้ว่าวิธีหนึ่งในการทำเช่นนี้จะเรียก
มีวิธีที่ดีกว่าในการทำเช่นนี้? มันจะดีมากถ้าฉันสามารถกำหนดลำดับ z ในโครงร่าง xml
ฉันต้องการกำหนดลำดับ z ของมุมมองของ RelativeLayout ใน Android
bringToFront
ฉันรู้ว่าวิธีหนึ่งในการทำเช่นนี้จะเรียก
มีวิธีที่ดีกว่าในการทำเช่นนี้? มันจะดีมากถ้าฉันสามารถกำหนดลำดับ z ในโครงร่าง xml
คำตอบ:
วิธีที่ง่ายที่สุดคือเพียงใส่ใจกับลำดับที่เพิ่มจำนวนการดูไปยังไฟล์ XML ของคุณ ลดลงในไฟล์หมายถึงสูงขึ้นในแกน Z
แก้ไข: เอกสารนี้ที่นี่และที่นี่บนเว็บไซต์นักพัฒนาซอฟต์แวร์ Android (ขอบคุณ @flightplanner)
โปรดทราบว่าปุ่มและองค์ประกอบอื่น ๆ ใน API 21 และสูงกว่านั้นมีระดับความสูงที่สูงและดังนั้นจึงไม่สนใจลำดับขององค์ประกอบ xml โดยไม่คำนึงถึงเค้าโครงหลัก เอาฉันสักครู่เพื่อหาอันนั้น
ใน Android ที่เริ่มต้นจาก API ระดับ 21 รายการในไฟล์เลย์เอาต์จะได้รับลำดับ Z ทั้งสองจากวิธีการสั่งซื้อภายในไฟล์ดังที่อธิบายไว้ในคำตอบที่ถูกต้องและจากระดับความสูงค่าระดับความสูงที่สูงขึ้นหมายถึงรายการนั้น .
บางครั้งสิ่งนี้อาจทำให้เกิดปัญหาโดยเฉพาะอย่างยิ่งกับปุ่มที่มักปรากฏอยู่ด้านบนของรายการที่เรียงตามลำดับของ XML ควรอยู่ด้านล่างตามลำดับ Z ในการแก้ไขปัญหานี้เพียงกำหนดandroid:elevation
รายการในเลย์เอาต์ XML ของคุณเพื่อให้ตรงกับคำสั่ง Z ที่คุณต้องการ
ฉันคุณตั้งค่าระดับความสูงขององค์ประกอบในเค้าโครงมันจะเริ่มร่ายเงา หากคุณไม่ต้องการเอฟเฟกต์นี้คุณสามารถลบเงาด้วยโค้ดดังนี้:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
ฉันไม่พบวิธีลบเงาของมุมมองที่ยกระดับผ่านเลย์เอาท์ xml
android:elevation="1000dp"
ตามที่ระบุไว้ในความคิดเห็นที่คุณสามารถใช้ ไม่มีเงาใด ๆ แสดงผลในลักษณะนี้
ฉันพบปัญหาเดียวกัน: ในโครงร่างที่เป็น parent parentView ฉันมีลูก 2 คน childView1 และ childView2 ตอนแรกฉันวาง childView1 เหนือ childView2 และฉันต้องการ childView1 ให้อยู่ด้านบนของ childView2 การเปลี่ยนลำดับการดูเด็กไม่ได้แก้ปัญหาสำหรับฉัน สิ่งที่ใช้ได้ผลสำหรับฉันคือตั้งค่าandroid: clipChildren = "false"บน parentView และในรหัสที่ฉันตั้งไว้:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
กับparent.invalidate()
งาน แต่parent.bringChildToFront(child)
ไม่ ตรรกะที่เราทุกคนคาดหวังจากระบบปฏิบัติการอยู่ที่ไหน
android:clipChildren="false"
ก็ทำการหลอกลวง ขอบคุณ!
โปรดทราบว่าคุณสามารถใช้view.setZ(float)
เริ่มต้นจาก API ระดับ 21 ที่นี่คุณสามารถค้นหาข้อมูลเพิ่มเติมได้
คิดว่าฉันจะเพิ่มคำตอบตั้งแต่การเปิดตัว
หุ่นยนต์: translationZ
ฟิลด์ XML เปลี่ยนสิ่งต่าง ๆ เป็นตาด คำตอบอื่น ๆ ที่แนะนำให้ทำงาน
childView1.bringToFront();
parentView.invalidate();
มีข้อยกเว้นทั้งหมดสำหรับรหัสนี้ที่จะไม่นำ childView1 ต่อหน้ามุมมองใด ๆ ที่มี android hardcoded: translateZ ในไฟล์ XML ฉันมีปัญหากับสิ่งนี้และเมื่อฉันลบฟิลด์นี้จากมุมมองอื่น bringToFront () ก็ใช้งานได้ดี
elevation
API 21 มีview.setElevation(float)
บิลด์อิน
ใช้ViewCompat.setElevation(view, float);
สำหรับความเข้ากันได้ย้อนหลัง
วิธีการเพิ่มเติมViewCompat.setZ(v, pixels)
และViewCompat.setTranslationZ(v, pixels)
อีกวิธีหนึ่งในการรวบรวมปุ่มหรือดูอาร์เรย์และใช้addView
เพื่อเพิ่มไปยัง RelativeLayout
childView.bringToFront () ไม่ได้ผลสำหรับฉันดังนั้นฉันจึงตั้งค่าการแปล Z ของรายการที่เพิ่มล่าสุดอย่างน้อยที่สุด (รายการที่ซ้อนทับเด็กคนอื่น ๆ ทั้งหมด) เป็นค่าลบดังนี้:
lastView.setTranslationZ(-10);
ดูhttps://developer.android.com/reference/android/view/View.html#setTranslationZ(float)สำหรับข้อมูลเพิ่มเติม
คุณสามารถใช้กำหนดเองRelativeLayout
กับนิยามใหม่
protected int getChildDrawingOrder (int childCount, int i)
โปรดระวัง - วิธีนี้ใช้พารามิเตอร์i
เป็น "ฉันควรวาดภาพi'th
ไหน" นี่คือวิธีการViewPager
ทำงาน PageTransformer
มันชุดคำสั่งที่กำหนดเองวาดภาพร่วมกับ
ตรวจสอบว่าคุณมีการยกระดับใด ๆ ของหนึ่งใน Views ใน XML ถ้าเป็นเช่นนั้นเพิ่มระดับความสูงให้กับรายการอื่นหรือลบระดับความสูงเพื่อแก้ไขปัญหา จากตรงนั้นมันเป็นลำดับของมุมมองที่กำหนดสิ่งที่อยู่เหนือสิ่งอื่น
หรือวางปุ่มที่ทับซ้อนกันหรือมุมมองภายใน FrameLayout จากนั้น RelativeLayout ในไฟล์ xml จะเคารพลำดับของเลย์เอาต์ลูกที่เพิ่มเข้ามา
คุณสามารถใช้ตัวอย่างโค้ดด้านล่างได้เช่นเดียวกัน
ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);
สิ่งนี้เข้ากันได้ย้อนหลัง นี่เป็นมุมมองที่ควรจะต่ำกว่าmCardView
sourceView