2016-06-15 65 views
0

我不知道爲什麼這總是很難得到工作。我正在使用AppCompat庫和android.app.Fragment。我嘗試添加動畫來左右滑動新的片段(就像iOS一樣),但是當添加片段時,他們會立即添加/刪除,而不需要任何動畫。R.animator with objectAnimators無法使用片段添加/刪除動畫

我在做什麼錯?

getFragmentManager() 
    .beginTransaction() 
    .setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_to_the_left) 
    .add(R.id.navrootlayout, fragment) 
    .addToBackStack(null) 
    .commit(); 

RES /動畫/ slide_in_from_right.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <objectAnimator 
     android:interpolator="@interpolator/decelerate_cubic" 
     android:valueFrom="1" 
     android:valueTo="0" 
     android:valueType="floatType" 
     android:propertyName="xFraction" 
     android:duration="3000"/> 
</set> 

RES /動畫/ slide_out_to_the_left.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <objectAnimator 
     android:interpolator="@interpolator/decelerate_cubic" 
     android:valueFrom="0" 
     android:valueTo="-1" 
     android:valueType="floatType" 
     android:propertyName="xFraction" 
     android:duration="3000"/> 
</set> 

我連動畫的持續時間設置爲3000(即,3秒)這樣我才能明確地看到它是否被使用,但事實並非如此。該片段完全沒有任何動畫。我捕獲了它發生的屏幕視頻,並且新片段立即出現(並最終消失)。

+0

什麼屬性爲 「xFraction」? – DeeV

+0

Yeeeeaaaah,我剛剛花了最後一小時弄清楚。顯然,這個例子我得到這個從假設,我會添加自定義屬性,以我的Layout類,但他們沒有提到這一點。 –

+0

我認爲,其原因是與動畫師沒有相對平移機制,所以你不能滑入。創建「xFraction」動畫(的「X」個我認爲)讓你做幻燈片的。 – DeeV

回答

0

我想出了我做錯了什麼。我從某個地方的例子中抓取了動畫XML文件,這個例子並沒有提到我需要自己實現xFraction屬性。我錯誤地認爲,這是一個內置的行爲會理解xFraction和X均與,類似的方式,舊的風格res/anim風格的動畫將允許您使用百分比值作爲動畫開始/結束值。但是,不,不。爲此,您必須創建佈局的子類並自己添加xFraction屬性。這是我做到的。

package com.mydomain.myapp; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.RelativeLayout; 

public class SlideableLayout extends RelativeLayout { 


    public SlideableLayout(Context context) { 
     super(context); 
    } 

    public SlideableLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public SlideableLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    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(); 
     if (width > 0) { 
      setX(xFraction * width); 
     } else { 
      setX(-10000); 
     } 
    } 
} 

然後,我的每片段,我想動畫和關閉屏幕,我用我的SlideableLayout作爲根佈局。

<?xml version="1.0" encoding="utf-8"?> 
<com.mydomain.myapp.SlideableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="@android:color/holo_blue_bright" 
    > 

</com.mydomain.myapp.SlideableLayout>