slide-in/slide-out
間のアニメーションをアニメーション化しようとしていFragments
ます。StackOverflowに同様の質問がたくさんあることは知っていますが、信じてください-私はそれらすべてを試しましたが、どれも機能していません。
私のコードに従ってください(基本的に同様の質問から取られました):
カスタム レイアウト
public class SlidingFrameLayout extends FrameLayout {
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);
}
}
フラグメント トランザクション
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.animator.card_enter_right, R.animator.card_out_left);
ft.replace(R.id.quiz_container, CardFragment.newInstance());
ft.commit();
オブジェクトアニメーター
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:interpolator="@android:anim/linear_interpolator"
android:propertyName="xFraction"
android:valueFrom="1.0"
android:valueTo="0.0"
android:valueType="floatType" />
レイアウトファイル
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.my.package.views.SlidingFrameLayout
android:id="@+id/quiz_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Other views -->
</FrameLayout>
したがって、このコードを実行しても何も起こりません。フラグメントは置き換えられますが、アニメーションはありません。
何が間違っていますか?
注:"x"
代わりに値を変更してアニメーションを実行している場合は、動作している"xFraction"
としましょうfrom:1280 to:0
。残念ながら、これは私にとっては解決策ではありません。表示解像度の範囲が広いため、 「パーセンテージ値」が必要だからです。
解決
私を解決策に導いてくれたpskinkに感謝します。Fragment のコンテナーは getXFraction()/setXFraction() メソッドを実装する必要があると常に考えていました。しかし、そうではありません。Fragments レイアウトを実装する必要がありますgetXFraction()/setXFraction
。したがって、基本的に Fragment-Layout を次のように変更しました。
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:prefix="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="40dp"
prefix:cardCornerRadius="4dp">
<!-- Content -->
</android.support.v7.widget.CardView>
に:
<com.my.package.views.SlidingFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:prefix="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="40dp"
prefix:cardCornerRadius="4dp">
<!-- Content -->
</android.support.v7.widget.CardView>
</com.my.package.views.SlidingFrameLayout>