2013-04-26 12 views
6

Bir parçadan diğerine geçerken bir 3D Cube döndürme efekti oluşturmaya çalışıyorum. İlk önce, FragmentTransaction.setCustomAnimations(...) numaralı çağrıyla bir çeviri efekti (XML'de) kullanıyordum ve daha sonra parçayı açarken/kapatırken, döndürmeyi yapmak için Camera classe ile oynuyordum.Android - Aynı XML dosyasında çeviriler ve objectAnimator oluşturma

Bu FINE üzerinde çalışıyordu, ancak sadece XML dosyası kullanarak bu animasyonu kullanmam için bana neden sormadım. Uzun bir aradan sonra rotasyon yapmak için objectAnimator kullanmam gerektiğini öğrendim.

Google örneğini takip ettim ve çevirme animasyonu yapmayı başardım. Şimdi, parçaları sürükleyerek ve kaydırarak parçalara çevirmem gerekiyor. Aynı XML dosyasında objectAnimator ve çeviri efektini kullanamayacağımı görünüyor. Bu hata görünür beri i kayma etkisini yapmak ve aynı zamanda üzerinde objectAnimator nasıl kullanabileceği üzerinde

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

Herhangi bir fikir?

Zaman ayırdığınız için teşekkür ederiz!

Kod i kullanıyorum:

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(); 
} 
(küp dönme bu 2 arasında görünür olmalıdır):

card_flip_right_in.xml bir fragmanını çağrı

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

Fragman

UPDATE:

Ben

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

kullanıyorum parçaların benim framelayout genişleten bir sınıf kullanarak önceki sorunun çözümü için yönetmek ve objectAnimator bu ekleyerek ettik Bu daha iyi çalışıyor, ancak rottation eksenleri FrameLayout ortasında vardır ve maki değil

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

Bir küpün yanılsamasını ... Döndürme eksenlerini belirli bir noktaya ayarlamak mümkün mü?

cevap

4

Genişletilmiş FrameLayout'ta kendi yöntemlerimi oluşturarak sorunu çözdüm.

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

Ve XML: Burada uzatılmış FrameLayout gelen kod Bu durumda

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

, tüm animasyon süresince @integer/card_flip_time_full standları ve bu durumda dereceye için @integer/card_flip_rotation_off standları (-90%).

Bundan sonra yapmam gereken tüm fragman başlatırken, bu bazı birine yararlı olabilir

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

Umut özel animasyon xml dosyaları ayarlanır işe bu animasyonu yapmak için ^^ burada görüldüğü gibi

+0

Benim durumumda FrameLayout yerine parçaların kök görünümünde ekstra yöntemler (getXFraction, setXFraction ...) vardı, ama sonuç aynıdır .. Teşekkürler – codeskraps

+0

@codeskraps fragmanların kök görünümünde ekstra yöntemler eklendi? Bir parçayı kaydırmak istiyorum ve bunu yapmak için genişletilmiş FrameLayout kullanıyorum. Çalışıyor ama bazı sorunları var. Bunu yapmanın daha iyi bir yolunu arıyorum. – crubio

-1

kabul edilen yanıt bir alternatif, sen bir animatör kümesi tanımlamak olabilir:

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

İlgili konular