Tôi đã cố gắng tạo hiệu ứng xoay 3D Cube trong khi trượt từ một đoạn này sang đoạn khác. Đầu tiên tôi đã sử dụng hiệu ứng dịch (trên XML) gọi với FragmentTransaction.setCustomAnimations(...)
và sau đó, khi mở/đóng đoạn, tôi đang chơi với máy ảnh classe để quay.Android - Tạo bản dịch và đối tượngAnimator trên cùng một tệp XML
Điều này đã hoạt động FINE, nhưng có vẻ như tôi CÓ QUÁ (không hỏi tôi tại sao) sử dụng tất cả hoạt ảnh này chỉ sử dụng tệp XML. Sau một tìm kiếm dài tôi phát hiện ra rằng tôi nên sử dụng objectAnimator để thực hiện luân chuyển.
Theo mẫu của Google và tôi quản lý để tạo hoạt ảnh lật. Bây giờ tôi cần dịch các mảnh vỡ khiến chúng trượt vào và trượt ra ngoài. Dường như tôi không thể sử dụng objectAnimator và dịch hiệu ứng trên cùng một tệp XML. Vì lỗi này xuất hiện:
java.lang.RuntimeException: Unknown animator name: translate at (...)
Bất kỳ ý tưởng nào về cách tôi có thể tạo hiệu ứng trượt và sử dụng đối tượngAnimator cùng một lúc?
Cảm ơn bạn đã dành thời gian!
Mã i đã sử dụng:
card_flip_right_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Before rotating, immediately set the alpha to 0. -->
<objectAnimator
android:duration="0"
android:propertyName="alpha"
android:valueFrom="1.0"
android:valueTo="0.0" />
<!-- Rotate. -->
<objectAnimator
android:duration="@integer/card_flip_time_full"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:propertyName="rotationY"
android:valueFrom="180"
android:valueTo="0" />
<!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
<objectAnimator
android:duration="1"
android:propertyName="alpha"
android:startOffset="@integer/card_flip_time_half"
android:valueFrom="0.0"
android:valueTo="1.0" />
</set>
Fragment gọi khác đoạn: (xoay khối lập phương nên được hiển thị giữa này 2)
private void launchArticle(int prev, int pos){
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putString("pos", pos);
args.putInt("prev", prev);
newFragment.setArguments(args);
android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();
Fragment currFrag = (Fragment)getFragmentManager().findFragmentById(R.id.headlines_fragment);
if (currFrag != null) {
transaction.hide(currFrag);
}
transaction.setCustomAnimations(
R.animator.card_flip_right_in,
R.animator.card_flip_right_out,
R.animator.card_flip_left_in,
R.animator.card_flip_left_out
);
transaction.replace(R.id.fragment_container, newFragment, pos);
transaction.addToBackStack(null);
transaction.commit();
}
CẬP NHẬT:
Tôi đã quản lý để giải quyết vấn đề trước đó sử dụng một lớp mà kéo dài framelayout của tôi về mảnh Tôi đang sử dụng
SlidingFrameLayout.java
public class SlidingFrameLayout extends FrameLayout
{
private static final String TAG = SlidingFrameLayout.class.getName();
public SlidingFrameLayout(Context context) {
super(context);
}
public SlidingFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public float getXFraction()
{
final int width = getWidth();
if(width != 0) return getX()/getWidth();
else return getX();
}
public void setXFraction(float xFraction) {
final int width = getWidth();
setX((width > 0) ? (xFraction * width) : -9999);
}
public float getYFraction()
{
final int height = getHeight();
if(height != 0) return getY()/getHeight(); else return getY();
}
public void setYFraction(float yFraction) {
final int height = getHeight();
setY((height > 0) ? (yFraction * height) : -9999);
}
}
và bằng cách thêm này đến objectAnimator :
<!-- Move -->
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/card_flip_time_full"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="xFraction"
android:valueFrom="-1"
android:valueTo="0" />
Điều này hoạt động tốt hơn, nhưng trục rottation nằm ở giữa FrameLayout và không phải maki ng ảo tưởng của một khối lập phương ... Có thể đặt trục xoay trên một điểm nhất định không?
Trong trường hợp của tôi, tôi phải có các phương thức bổ sung (getXFraction, setXFraction ...) trên khung nhìn gốc của các mảnh thay vì FrameLayout, nhưng kết quả là như nhau .. Cảm ơn – codeskraps
@codeskraps bạn có thể chỉ cho bạn thấy thêm các phương thức bổ sung vào chế độ xem gốc của các đoạn? Tôi muốn trượt một mảnh và tôi đang sử dụng FrameLayout mở rộng để làm như vậy. Nó hoạt động nhưng nó có một số vấn đề. Tôi đang tìm cách tốt hơn để làm điều này. – crubio