คุณควรใช้การเลื่อนแบบนั้นเช่นไคลเอ็นต์ Honeycomb Gmail ใช้อย่างไร
สามารถTransactionManager
จัดการสิ่งนี้โดยอัตโนมัติโดยการเพิ่มและลบ Fragments มันยากที่จะทดสอบสิ่งนี้เนื่องจากตัวจำลองเป็นสไลด์โชว์ :)
คุณควรใช้การเลื่อนแบบนั้นเช่นไคลเอ็นต์ Honeycomb Gmail ใช้อย่างไร
สามารถTransactionManager
จัดการสิ่งนี้โดยอัตโนมัติโดยการเพิ่มและลบ Fragments มันยากที่จะทดสอบสิ่งนี้เนื่องจากตัวจำลองเป็นสไลด์โชว์ :)
คำตอบ:
ในการเคลื่อนไหวการเปลี่ยนระหว่างแฟรกเมนต์หรือเพื่อทำให้กระบวนการแสดงหรือซ่อนแฟรกเมนต์ที่คุณใช้Fragment Manager
เพื่อสร้างFragment Transaction
ในการสร้าง
ภายในแต่ละ Fragment Transaction คุณสามารถระบุภาพเคลื่อนไหวเข้าและออกที่จะใช้สำหรับการแสดงและซ่อนตามลำดับ (หรือทั้งสองอย่างเมื่อใช้การแทนที่)
รหัสต่อไปนี้แสดงให้เห็นว่าคุณจะแทนที่ชิ้นส่วนได้อย่างไรโดยการเลื่อนชิ้นส่วนหนึ่งออกมาและเลื่อนส่วนอื่น ๆ เข้ามาแทน
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
DetailsFragment newFragment = DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");
// Start the animated transition.
ft.commit();
เพื่อให้บรรลุสิ่งเดียวกันด้วยการซ่อนหรือแสดงชิ้นส่วนที่คุณเพียงโทรft.show
หรือft.hide
ผ่านในส่วนที่คุณต้องการแสดงหรือซ่อนตามลำดับ
สำหรับการอ้างอิงนิยามของภาพเคลื่อนไหว XML จะใช้objectAnimator
แท็ก ตัวอย่างของ slide_in_left อาจมีลักษณะเช่นนี้:
<?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>
หากคุณไม่จำเป็นต้องใช้ไลบรารีการสนับสนุนโปรดดูคำตอบของโรมัน
แต่ถ้าคุณต้องการใช้ไลบรารีการสนับสนุนคุณต้องใช้กรอบแอนิเมชั่นเก่าตามที่อธิบายไว้ด้านล่าง
หลังจากปรึกษาคำตอบของ Retoและblindstuffฉันได้รับรหัสต่อไปนี้ที่ใช้งานได้
ชิ้นส่วนที่ปรากฏจะเลื่อนจากด้านขวาและเลื่อนไปทางซ้ายเมื่อกดด้านหลัง
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();
คำสั่งซื้อเป็นสิ่งสำคัญ หมายความว่าคุณต้องโทรหาsetCustomAnimations()
ก่อนมิreplace()
ฉะนั้นการเคลื่อนไหวจะไม่มีผล!
ถัดไปไฟล์เหล่านี้จะต้องอยู่ในres / animโฟลเดอร์
enter.xml :
<?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="@android:integer/config_mediumAnimTime"/>
</set>
exit.xml :
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
pop_enter.xml :
<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="@android:integer/config_mediumAnimTime"/>
</set>
pop_exit.xml :
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
ระยะเวลาของภาพเคลื่อนไหวสามารถเปลี่ยนเป็นค่าเริ่มต้นเช่น@android:integer/config_shortAnimTime
หรือหมายเลขอื่น ๆ
โปรดทราบว่าหากในระหว่างการเปลี่ยนชิ้นส่วนการเปลี่ยนแปลงการกำหนดค่าที่เกิดขึ้น (เช่นการหมุน) การกระทำกลับไม่เคลื่อนไหว นี่เป็นข้อบกพร่องที่ทำเป็นเอกสารซึ่งยังคงมีอยู่ใน rev 20 ของไลบรารีการสนับสนุน
ฉันขอแนะนำให้คุณใช้สิ่งนี้แทนการสร้างไฟล์แอนิเมชันเพราะมันเป็นทางออกที่ดีกว่ามาก Android Studio มีค่าเริ่มต้นที่ animation
คุณสามารถใช้ได้โดยไม่ต้องสร้างไฟล์ XML ใหม่ ชื่อภาพเคลื่อนไหวคือandroid.R.anim.slide_in_leftและandroid.R.anim.slide_out_rightและคุณสามารถใช้มันได้ดังต่อไปนี้:
fragmentTransaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();
เอาท์พุท:
ไลบรารีการสนับสนุนที่แก้ไขแล้วของฉันรองรับการใช้ทั้งภาพเคลื่อนไหวดู (เช่น<translate>, <rotate>
) และ Object Animators (เช่น<objectAnimator>
) สำหรับ Fragment Transitions มันถูกนำมาใช้กับNineOldAndroids อ้างถึงเอกสารของฉันเกี่ยวกับ GitHub สำหรับรายละเอียด
สำหรับฉันฉันต้องการมุมมอง diraction:
ใน -> ปัดจากขวา
ออก -> ปัดไปทางซ้าย
ที่นี่ใช้งานได้สำหรับฉันรหัส:
slide_in_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
slide_out_left.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="-50%p"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
รหัสการทำธุรกรรม:
inline fun FragmentActivity.setContentFragment(
containerViewId: Int,
backStack: Boolean = false,
isAnimate: Boolean = false,
f: () -> Fragment
): Fragment? {
val manager = supportFragmentManager
return f().apply {
manager.beginTransaction().let {
if (isAnimate)
it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
if (backStack) {
it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
} else {
it.replace(containerViewId, this, "Fr").commit()
}
}
}
}
ฉันแก้ไขวิธีนี้ด้านล่าง
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment