สลับส่วนในกิจกรรมผ่านภาพเคลื่อนไหว


94

ฉันต้องการสลับสองส่วนในกิจกรรมผ่านแอนิเมชั่นสมมติว่า PageA มีไว้สำหรับการแบ่งส่วน A และด้านซ้ายของหน้าจอและ PageB สำหรับส่วน B เช่นทางด้านขวาของหน้าจอ ตอนนี้ฉันต้องการอย่างนั้นเมื่อฉันคลิกปุ่มบนหน้าจากนั้น PageA จะย้ายไปทางด้านขวาของหน้าจอพร้อมกับภาพเคลื่อนไหวการเปลี่ยนภาพ

ฉันลองใช้รหัสด้านล่างเพื่อแทนที่ตำแหน่ง

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

กำลังมองหาเบาะแสบางอย่าง

ขอบคุณล่วงหน้า.


คำตอบ:


285

ภารกิจเก่าและคุณอาจคิดออกแล้ว แต่สำหรับการอ้างอิงในอนาคต:

นี่คือสิ่งที่คุณใช้ในการตั้งค่าภาพเคลื่อนไหวที่กำหนดเองเมื่อคุณแทนที่ส่วนด้วยรหัส:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

นี่คือตัวอย่างของภาพเคลื่อนไหว slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

โปรดทราบว่านี่เป็นภาพเคลื่อนไหวหากคุณใช้ไลบรารีความเข้ากันได้ แต่ถ้าคุณใช้และ SDK พร้อมการสนับสนุนดั้งเดิมสำหรับ FragmentManager ภาพเคลื่อนไหวของคุณจะมีลักษณะดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

เนื่องจากไลบรารีความเข้ากันได้ไม่สนับสนุนชนิด objectAnimator ใหม่และใช้เฉพาะเฟรมเวิร์กภาพเคลื่อนไหวเก่าแทน


92
นี่คือคำตอบที่ใช่แน่นอน โปรดทราบว่าการสั่งซื้อมีความสำคัญ! คุณต้องมีการเรียก setCustomAnimations () ก่อนที่จะเพิ่ม / แทนที่การโทร!
theelfismike

2
คุณควรใช้แนวทางใดหากต้องการคอมพ์ที่ดีที่สุด?
basickarl

17
ภาพเคลื่อนไหวที่แตกต่างกันเหล่านี้ไม่เท่ากันทุกประการ คุณสมมติว่าความกว้างของส่วนของคุณเท่ากับ 1280 โดยใช้ค่าจาก -1280 หากความกว้างมากกว่านั้นจะไม่เริ่มต้นจากหน้าจอโดยสิ้นเชิง
egfconnor

53
คุณสามารถใช้ภาพเคลื่อนไหวที่กำหนดไว้ล่วงหน้าจากเนมสเปซ Android แทน: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy

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