2013-04-26 70 views
6

我一直在尝试在从一个片段滑动到另一个片段时制作3D立方体旋转效果。 首先我使用了翻译效果(在XML上),调用FragmentTransaction.setCustomAnimations(...),然后,当打开/关闭片段时,我正在使用Camera类进行旋转。Android - 在同一个XML文件上制作翻译和objectAnimator

这是行之有效的,但似乎我必须(不要问我为什么)使用所有这个动画只使用XML文件。经过漫长的搜索后,我发现我应该使用objectAnimator来进行旋转。

跟着谷歌样本,我设法做翻转动画。现在我需要翻译碎片,使它们滑入并滑出。似乎我不能使用objectAnimator并在同一个XML文件上转换效果。由于此错误出现:

java.lang.RuntimeException: Unknown animator name: translate at (...) 

有关如何使滑动效果和同时使用objectAnimator的任何想法?

谢谢你的时间!

代码,我一直在使用:

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> 

片段调用另一个片段:(立方体转动的应该是这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(); 
} 

更新:

我管理使用扩展我的片段的FrameLayout我使用

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); 
    } 
} 

一个类来解决前面的问题,并通过添加这给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" /> 

这工作更好,但旋转轴位于FrameLayout的中间,它不是maki在立方体的错觉中......是否可以在某个点上设置旋转轴?

回答

4

通过在扩展FrameLayout上创建我自己的方法解决了这个问题。下面是从扩展的FrameLayout代码:

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

而关于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"/> 

在这种情况下,@integer/card_flip_time_full代表整个动画的持续时间和@integer/card_flip_rotation_off代表的程度(在这种情况下, -90%)。

在此之后,我需要做的,使这个动画的工作,开始时的片段,在自定义动画

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

希望这可以在一定一种有用的设置XML文件^^

+0

在我的情况下,我不得不在碎片的根视图上使用额外的方法(getXFraction,setXFraction ...),而不是FrameLayout,但结果是一样的。谢谢 – codeskraps 2014-07-07 14:49:18

+0

@codeskraps你能告诉我你是怎么做到的在碎片的根视图上添加额外的方法?我想滑动一个片段,然后使用扩展的FrameLayout来实现。它有效,但它有一些问题。我正在寻找更好的方法来做到这一点。 – crubio 2015-09-04 12:42:52

-1

公认的答案的选择,你可以定义一个动画集,在这里看到:

<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?