2012-06-04 33 views
94

Tôi nghĩ hệ thống sẽ đảo ngược hình ảnh động trên backstack khi nút quay lại được nhấn khi sử dụng mảnh bằng cách sử dụng đoạn mã sau:Làm thế nào để đảo ngược hình ảnh động trên BackStack?

FragmentManager fm = getFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out); 
ft.replace(R.id.viewContainer, new class(), "layout").addToBackStack(null).commit(); 

Trả lời

222

Theo android documentation for custom animation:

Thay đổi:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out); 

Tới:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out); 

và bây giờ là hoạt hình backstack - Ngược lại !!

+2

btw, tôi biết điều này là không kết nối với câu hỏi và câu trả lời của bạn, nhưng bạn có thể có thể liên kết với tôi một cái gì đó mà giải thích customAnimations một một chút? : P – AreusAstarte

+4

Cảm ơn bạn rất nhiều. Câu trả lời chính xác. –

+2

AreusAstarte: xem http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int) – mDroidd

14

Sử dụng hình ảnh động đúng Tôi đã sử dụng sau đây và làm việc của nó giống như một nét duyên dáng

slide_in_left.xml

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

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="@android:integer/config_mediumAnimTime" > 

    <objectAnimator 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:duration="500" 
     android:propertyName="x" 
     android:valueFrom="0" 
     android:valueTo="1000" 
     android:valueType="floatType" /> 

</set> 

slide_out_left .xml

<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="@android:integer/config_mediumAnimTime" > 

    <objectAnimator 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:duration="500" 
     android:propertyName="x" 
     android:valueFrom="0" 
     android:valueTo="-1000" 
     android:valueType="floatType" /> 

</set> 

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="@android:integer/config_mediumAnimTime" > 

    <objectAnimator 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:duration="500" 
     android:propertyName="x" 
     android:valueFrom="-1000" 
     android:valueTo="0" 
     android:valueType="floatType" /> 

</set> 

Sau đó, sử dụng sau khi thêm đoạn

setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, 
           R.anim.slide_out_right, R.anim.slide_in_right) 

và nó sẽ làm việc 100%

+2

Lưu ý rằng thao tác này sẽ không hoạt động nếu bạn đang sử dụng trình quản lý phân đoạn hỗ trợ hoặc nếu đoạn của bạn mở rộng phiên bản hỗ trợ của Fragment – w3bshark

+0

@ w3bshark Làm cách nào để tạo hoạt ảnh như vậy bằng cách sử dụng 'FragmentManager' và' Fragment' từ thư viện hỗ trợ? –

+1

@DanielShatz Bạn phải sử dụng bản dịch hơn là đối tượngNhân viên. Ví dụ: slide_in_left.xml sẽ là: '' Xem câu trả lời này: http://stackoverflow.com/a/5151774/1738090 – w3bshark

2
.setCustomAnimations(R.animator.fragment_fade_in, 
     R.animator.fragment_fade_out, 
     R.animator.fragment_fade_p_in, 
     R.animator.fragment_fade_p_out) 

Thay trên với:

mFragmentManager.beginTransaction() 
    .setCustomAnimations(R.animator.fragment_fade_in, 
      R.animator.fragment_fade_out, 
      R.animator.fragment_fade_p_in, 
      R.animator.fragment_fade_p_out) 
    .replace(R.id.main_container, FragmentPlayerInfo.getInstance(data)) 
    .addToBackStack(FragmentPlayerInfo.TAG) 
    .commit(); 
+1

Tôi khuyên bạn nên thêm giải thích về cách đề xuất của bạn giúp. – Wtower

+2

Tôi không biết tại sao nó hoạt động (:, nhưng khi thêm hoạt ảnh sau 'replace' và' addToBackstack', không hoạt động – TarikW

+2

@TarikW Tôi hơi muộn, nhưng thứ tự quan trọng trong việc này, bạn cần gọi setCostomAnimations trước khi thay thế , addToBackStack phương pháp – Tahir

1

trong trường hợp của tôi

ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, 
         R.anim.slide_in_right, R.anim.slide_out_left); 

sẽ tạo ra hình ảnh động hoàn hảo.

slide_in_right

<?xml version="1.0" encoding="utf-8"?> 
<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 version="1.0" encoding="utf-8"?> 
<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> 
+0

Cool ... Nó làm việc cho tôi. –

Các vấn đề liên quan