Bạn nên triển khai loại trượt như ví dụ như ứng dụng khách Honeycomb Gmail sử dụng như thế nào?
Có thể TransactionManager
tự động xử lý việc này bằng cách thêm và xóa các Mảnh vỡ, thật khó để kiểm tra điều này do trình giả lập là trình chiếu :)
Bạn nên triển khai loại trượt như ví dụ như ứng dụng khách Honeycomb Gmail sử dụng như thế nào?
Có thể TransactionManager
tự động xử lý việc này bằng cách thêm và xóa các Mảnh vỡ, thật khó để kiểm tra điều này do trình giả lập là trình chiếu :)
Câu trả lời:
Để tạo hiệu ứng cho quá trình chuyển đổi giữa các đoạn hoặc để tạo hiệu ứng cho quá trình hiển thị hoặc ẩn một đoạn bạn sử dụng Fragment Manager
để tạoFragment Transaction
.
Trong mỗi Giao dịch phân mảnh, bạn có thể chỉ định hoạt ảnh trong và ngoài sẽ được sử dụng để hiển thị và ẩn tương ứng (hoặc cả hai khi thay thế được sử dụng).
Đoạn mã sau cho thấy cách bạn sẽ thay thế một đoạn bằng cách trượt ra một đoạn và trượt đoạn kia vào vị trí của nó.
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();
Để đạt được điều tương tự với việc ẩn hoặc hiển thị một đoạn bạn chỉ cần gọi ft.show
hoặc ft.hide
chuyển qua Đoạn bạn muốn hiển thị hoặc ẩn tương ứng.
Để tham khảo, các định nghĩa hoạt hình XML sẽ sử dụng objectAnimator
thẻ. Một ví dụ về slide_in_left có thể trông giống như thế này:
<?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>
Nếu bạn không phải sử dụng thư viện hỗ trợ thì hãy xem câu trả lời của Roman .
Nhưng nếu bạn muốn sử dụng thư viện hỗ trợ, bạn phải sử dụng khung hoạt hình cũ như được mô tả dưới đây.
Sau khi tham khảo câu trả lời của Reto và người mù, tôi đã nhận được đoạn mã sau hoạt động.
Các mảnh vỡ xuất hiện trượt từ bên phải và trượt ra bên trái khi nhấn trở lại.
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();
Thứ tự là quan trọng. Điều này có nghĩa là bạn phải gọi setCustomAnimations()
trước replace()
hoặc hình ảnh động sẽ không có hiệu lực!
Tiếp theo các tệp này phải được đặt trong thư mục 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>
Thời lượng của hình ảnh động có thể được thay đổi thành bất kỳ giá trị mặc định nào như @android:integer/config_shortAnimTime
hoặc bất kỳ số nào khác.
Lưu ý rằng nếu ở giữa các thay thế phân đoạn, một sự thay đổi cấu hình xảy ra (ví dụ như xoay vòng) thì hành động quay lại không hoạt hình. Đây là một lỗi tài liệu vẫn còn tồn tại trong rev 20 của thư viện hỗ trợ.
Tôi thực sự khuyên bạn nên sử dụng điều này thay vì tạo tệp hoạt hình vì đó là một giải pháp tốt hơn nhiều. Android Studio đã cung cấp mặc định animation
bạn có thể sử dụng mà không cần tạo bất kỳ tệp XML mới nào. Tên của hình ảnh động là android.R.anim.slide_in_left và android.R.anim.slide thừng_right và bạn có thể sử dụng chúng như sau:
FragmentTransaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide thừng_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();
Đầu ra:
Thư viện hỗ trợ đã sửa đổi của tôi hỗ trợ bằng cách sử dụng cả Xem hoạt hình (tức là <translate>, <rotate>
) và Đối tượng hoạt hình (tức là <objectAnimator>
) cho Chuyển tiếp phân đoạn. Nó được thực hiện với NineOldAndroids . Tham khảo tài liệu của tôi trên github để biết chi tiết.
Đối với tôi, tôi cần giao diện xem:
trong -> vuốt từ phải sang
ra -> vuốt sang trái
Ở đây làm việc cho tôi mã:
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 tựa_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>
mã giao dịch:
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()
}
}
}
}
Tôi giải quyết theo cách này
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment