2013-04-26 25 views
6

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?

Trả lời

4

Giải quyết sự cố bằng cách tạo phương thức của riêng tôi trên FrameLayout mở rộng. Dưới đây là mã từ FrameLayout mở rộng:

//Rotate from Left to Right turning visible 
    public float getRotateLeftRightIn(){ 
     return getRotationY(); 
    } 
    public void setRotateLeftRightIn(int rotateLeftRightIn){ 
     setPivotX(getWidth()); 
     setPivotY(getHeight()/2); 
     setRotationY(rotateLeftRightIn); 
    } 

Và trên XML:

<!-- Rotate. --> 
<objectAnimator 
    android:duration="@integer/card_flip_time_full" 
    android:interpolator="@android:interpolator/accelerate_decelerate" 
    android:propertyName="rotateLeftRightIn" 
    android:valueFrom="@integer/card_flip_rotation_off" 
    android:valueTo="0" 
    android:valueType="intType"/> 

Trong trường hợp này, @integer/card_flip_time_full đứng trong suốt thời gian của toàn bộ hình ảnh động và @integer/card_flip_rotation_off đứng cho độ (trong trường hợp này -90%).

Sau đó, tất cả những gì cần phải làm để làm cho hình ảnh động này để làm việc được, khi bắt đầu đoạn, thiết lập các tập tin xml trong hoạt hình tùy chỉnh

transaction.setCustomAnimations(enter,exit,popEnter,popExit); 

Hy vọng điều này có thể có ích cho một ai ^^

+0

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

+0

@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

-1

một thay thế cho câu trả lời được chấp nhận, bạn có thể xác định một bộ phim hoạt hình, như đã thấy ở đây:

<item android:state_pressed="true"> 
    <set> 
     <objectAnimator android:propertyName="translationZ" 
     android:duration="100" 
     android:valueTo="2" 
     android:valueType="floatType"/> 
     <!-- you could have other objectAnimator elements 
      here for "x" and "y", or other properties --> 
    </set> 
    </item> 

    <item android:state_enabled="true" 
    android:state_pressed="false" 
    android:state_focused="true"> 
    <set> 
     <objectAnimator android:propertyName="translationZ" 
     android:duration="100" 
     android:valueTo="2" 
     android:valueType="floatType"/> 
    </set> 
    </item> 

How to use StateListAnimator?

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