TL; DR: ฉันกำลังมองหาตัวอย่างการทำงานที่สมบูรณ์ของสิ่งที่ฉันจะอ้างถึงว่าเป็น "ภาพเคลื่อนไหวสามมิติของ Gmail" โดยเฉพาะเราต้องการเริ่มต้นด้วยสองแฟรกเมนต์เช่นนี้:
เมื่อมีเหตุการณ์ UI บางอย่าง (เช่นแตะบางสิ่งใน Fragment B) เราต้องการ:
- แฟรกเมนต์ A เพื่อเลื่อนหน้าจอไปทางซ้าย
- แฟรกเมนต์ B เพื่อเลื่อนไปที่ขอบด้านซ้ายของหน้าจอและย่อขนาดเพื่อดึงตำแหน่งที่ว่างโดย Fragment A
- แฟรกเมนต์ C เพื่อเลื่อนจากด้านขวาของหน้าจอและเพื่อจับภาพที่ว่างโดย Fragment B
และในการกดปุ่ม BACK เราต้องการให้ชุดการทำงานนั้นกลับด้าน
ตอนนี้ฉันเห็นการใช้งานบางส่วนมากมาย ฉันจะตรวจสอบสี่ของพวกเขาด้านล่าง พวกเขาต่างก็มีปัญหา
@Reto ไมเออร์มีส่วนคำตอบนี้เป็นที่นิยมกับคำถามพื้นฐานที่เหมือนกันแสดงให้เห็นว่าคุณจะใช้กับsetCustomAnimations()
FragmentTransaction
สำหรับสถานการณ์สองส่วน (เช่นคุณเห็นเฉพาะ Fragment A ในตอนแรกและต้องการแทนที่ด้วย Fragment B ใหม่โดยใช้เอฟเฟกต์แบบเคลื่อนไหว) ฉันอยู่ในข้อตกลงที่สมบูรณ์ อย่างไรก็ตาม:
- เนื่องจากคุณสามารถระบุได้เพียงหนึ่งภาพเคลื่อนไหว "ใน" และ "ออก" หนึ่งภาพฉันไม่สามารถดูว่าคุณจะจัดการกับภาพเคลื่อนไหวต่าง ๆ ที่จำเป็นสำหรับสถานการณ์สามส่วนได้อย่างไร
<objectAnimator>
ในตัวอย่างรหัสของเขาใช้ตำแหน่งยากสายพิกเซลและที่ดูเหมือนจะเป็นไปไม่ได้ที่ได้รับแตกต่างกันขนาดหน้าจอยังsetCustomAnimations()
ต้องใช้ทรัพยากรเคลื่อนไหว precluding ความเป็นไปได้ของการกำหนดสิ่งเหล่านี้ในชวา- ฉันกำลังสูญเสียว่าอนิเมเตอร์ออบเจกต์มีความสัมพันธ์กับสิ่งต่าง ๆ เช่น
android:layout_weight
ในการLinearLayout
จัดสรรพื้นที่เป็นเปอร์เซ็นต์ได้อย่างไร - ฉันสูญเสียวิธีจัดการกับ Fragment C ในตอนแรก (
GONE
?android:layout_weight
ของ0
ภาพเคลื่อนไหวก่อนถึงระดับ 0 เป็นอย่างอื่น?)
@Roman Nurik ชี้ให้เห็นว่าคุณสามารถเคลื่อนไหวทรัพย์สินใด ๆรวมถึงสิ่งที่คุณกำหนดเอง ที่สามารถช่วยแก้ปัญหาตำแหน่งสายแข็งได้ด้วยค่าใช้จ่ายในการประดิษฐ์คลาสย่อยตัวจัดการโครงร่างที่กำหนดเองของคุณเอง มันช่วยได้บ้าง แต่ฉันก็ยังงงกับการแก้ปัญหาของ Reto ที่เหลืออยู่
ผู้เขียนรายการ pastebin นี้จะแสดงรหัสปลอมที่เย้ายวนใจโดยพื้นฐานแล้วบอกว่าทั้งสามแฟรกเมนต์จะอยู่ในคอนเทนเนอร์ในตอนแรกโดยมีแฟรกเมนต์ C ซ่อนอยู่ตั้งแต่แรกผ่านการhide()
ทำธุรกรรม จากนั้นเราจะshow()
C และhide()
A เมื่อเหตุการณ์ UI เกิดขึ้น อย่างไรก็ตามฉันไม่เห็นวิธีที่จัดการกับความจริงที่ว่า B เปลี่ยนขนาด นอกจากนี้ยังขึ้นอยู่กับความจริงที่ว่าคุณสามารถเพิ่มชิ้นส่วนหลายชิ้นลงในภาชนะเดียวกันและฉันไม่แน่ใจว่าพฤติกรรมที่เชื่อถือได้ในระยะยาวหรือไม่ (ไม่ต้องพูดถึงมันควรแตกfindFragmentById()
แต่ฉันสามารถอยู่กับมันได้)
ผู้เขียนบทความในบล็อกนี้ระบุว่า Gmail ไม่ได้ใช้setCustomAnimations()
งานเลย แต่ใช้ภาพเคลื่อนไหวของวัตถุโดยตรง ("คุณเพียงแค่เปลี่ยนระยะขอบซ้ายของมุมมองราก + เปลี่ยนความกว้างของมุมมองด้านขวา") อย่างไรก็ตามนี่ยังคงเป็นโซลูชันสองส่วน AFAICT และการใช้งานจะแสดงมิติฮาร์ดเส้นในพิกเซลอีกครั้ง
ฉันจะเสียบปลั๊กต่อไปดังนั้นฉันอาจยุติการตอบคำถามนี้สักวัน แต่ฉันหวังว่าจะมีใครบางคนทำงานแก้ปัญหาสามส่วนสำหรับสถานการณ์ภาพเคลื่อนไหวนี้และสามารถโพสต์โค้ด (หรือลิงก์) แอนิเมชั่นใน Android ทำให้ฉันอยากดึงผมออกมาและพวกคุณที่เห็นฉันรู้ว่านี่เป็นความพยายามที่ไร้ผลส่วนใหญ่