2013-04-26 18 views
6

私は、ある断片から別の断片にスライドしながら3Dキューブの回転効果を作りようとしています。 最初にFragmentTransaction.setCustomAnimations(...)でコールする翻訳エフェクト(XML上)を使用していましたが、フラグメントを開いたり閉じたりするときに、カメラクラスを使用して回転を行っていました。Android - 同じXMLファイルで翻訳とobjectAnimatorを作成する

これはFINEで動作していましたが、XMLファイルのみを使用して、このアニメーションのすべてを使用する理由がわかりません。長い検索の後、私は回転をするためにobjectAnimatorを使うべきであることを知りました。

Googleサンプルに続いて、私はフリップアニメーションを作ります。今私はそれらをスライディングインとスライディングアウトする断片を翻訳する必要があります。私はobjectAnimatorを使用して、同じXMLファイルにエフェクトを変換することはできないようです。このエラーは次のように表示されるので、

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

どのように私はスライドエフェクトを作成し、同時にobjectAnimatorを使用することができますか?

ありがとうございました!

iが使用されてきたコード:

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

更新日:

私は

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にこれを追加することによってを使用していた断片の私でframeLayoutを拡張するクラスを使用して、前の問題を解決するために管理してきました

:これは良く働いているが、rottation軸はでframeLayoutの真ん中にあり、それがmakiない

<!-- 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" /> 

立方体の錯視...回転軸をある点で設定することは可能ですか?

答えて

4

拡張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_rotation_offスタンドの略@integer/card_flip_time_fullこの場合には(ここでは、拡張でframeLayoutからのコードです-90%)。この後

、私は仕事にこのアニメーションを作るために行う必要があるすべては、フラグメントを開始するときに、カスタムアニメーションで、これはいくつかのいずれかに役立つことができ

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

希望をxmlファイルに設定されている^^ここに見られるように

+0

私の場合は、FrameLayoutの代わりにフラグメントのルートビューで余分なメソッド(getXFraction、setXFraction ...)を持っていなければなりませんでしたが、結果は同じです..ありがとう – codeskraps

+0

@codeskrapsは、フラグメントのルートビューに余分なメソッドを追加しましたか?私はフラグメントをスライドしたいと私はそうするために拡張FrameLayoutを使用しています。それは動作しますが、いくつかの問題があります。私はこれを行うより良い方法を探しています。 – crubio

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

関連する問題