Programing

프래그먼트 간 전환 애니메이션

lottogame 2020. 3. 27. 08:00
반응형

프래그먼트 간 전환 애니메이션


조각 사이의 전환을 애니메이션하려고합니다. 다음 Android Fragments 및 애니메이션 에서 답을 얻었습니다.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

그리고 내 R.anim.slide_in_left

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
       <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

하지만 이것을 시도했을 때

02-08 16:27:37.961: ERROR/AndroidRuntime(1717): FATAL EXCEPTION: main
02-08 16:27:37.961: ERROR/AndroidRuntime(1717): java.lang.RuntimeException: Unknown animator name: translate
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.loadAnimator(FragmentManager.java:621)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:733)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.BackStackRecord.run(BackStackRecord.java:578)
02-08 16:27:37.961: ERROR/AndroidRuntime(1717):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1217)

어떤 아이디어? Honeycomb API 참조를 확인하면 translate거기에 있습니다. 내가 놓친 게 무엇입니까?
프래그먼트 간 전환에 애니메이션을 적용 할 수있는 다른 방법이 있습니까? 감사합니다


당신은 새로운 사용해야 android.animation와 프레임 워크 (객체 애니메이터) FragmentTransaction.setCustomAnimations뿐만 아니라 FragmentTransaction.setTransition.

다음 setCustomAnimations은 ApiDemos의 FragmentHideShow.java 를 사용하는 예입니다 .

ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);

다음은 res / animator / fade_in.xml 의 관련 애니메이터 XML입니다 .

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/accelerate_quad"
    android:valueFrom="0"
    android:valueTo="1"
    android:propertyName="alpha"
    android:duration="@android:integer/config_mediumAnimTime" />

<set>이전 애니메이션 프레임 워크에서와 마찬가지로을 사용하여 여러 애니메이터를 결합 할 수 있습니다 .


편집 : 사람들은 슬라이드 인 / 슬라이드 아웃에 대해 묻기 때문에 여기에 언급 할 것입니다.

슬라이드 인 및 슬라이드 아웃

당신은 물론 애니메이션을 적용 할 수 있습니다 translationX, translationY, x, 및 y특성을하지만, 일반적으로 슬라이드와 오프 스크린 컨텐츠를 애니메이션을 포함한다. 내가 아는 한 상대 값을 사용하는 전환 속성이 ​​없습니다. 그러나 이것이 직접 작성하는 것을 방해하지는 않습니다. (가) (이 경우보기에) 당신에게있는 거 생기를 객체에 그냥 할 수 있도록 해당 속성 애니메이션 단순히 getter와 setter 메소드를 필요로 기억 자신의 생성 getXFractionsetXFraction같은,보기 서브 클래스에 방법 :

public class MyFrameLayout extends FrameLayout {
    ...
    public float getXFraction() {
        return getX() / getWidth(); // TODO: guard divide-by-zero
    }

    public void setXFraction(float xFraction) {
        // TODO: cache width
        final int width = getWidth();
        setX((width > 0) ? (xFraction * width) : -9999);
    }
    ...
}

이제 다음과 같이 'xFraction'속성에 애니메이션을 적용 할 수 있습니다.

res / animator / slide_in.xml :

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:valueFrom="-1.0"
    android:valueTo="0"
    android:propertyName="xFraction"
    android:duration="@android:integer/config_mediumAnimTime" />

애니메이션을 적용하는 객체의 너비가 부모와 동일한 너비가 아닌 경우 상황이 제대로 표시되지 않으므로 사용 사례에 맞게 속성 구현을 조정해야 할 수도 있습니다.


나는 이렇게했다 :

방법추가 하여 조각애니메이션 으로 대체하십시오 .

public void replaceFragmentWithAnimation(android.support.v4.app.Fragment fragment, String tag){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_right, R.anim.exit_to_left);
    transaction.replace(R.id.fragment_container, fragment);
    transaction.addToBackStack(tag);
    transaction.commit();
}

당신은해야 할 추가 네 애니메이션ANIM 입니다 폴더 동료자원 :

enter_from_left.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

exit_to_right.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

enter_from_right.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

exit_to_left.xml :

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="-100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

산출:

여기에 이미지 설명을 입력하십시오

그것의 완료 .


롤리팝 이상에 자신을 묶을 여유가 있다면 트릭을 수행하는 것 같습니다.

import android.transition.Slide;
import android.util.Log;
import android.view.Gravity;
.
.
.
f = new MyFragment();
f.setEnterTransition(new Slide(Gravity.RIGHT));
f.setExitTransition(new Slide(Gravity.LEFT));
getFragmentManager()
    .beginTransaction()
    .replace(R.id.content, f, FRAG_TAG)  // FRAG_TAG is the tag for your fragment
    .commit();

도움이 되었기를 바랍니다.


Nurik 의 대답은 매우 도움이되었다,하지만 난 찾을 때까지 나는 일에 그것을 얻을 수없는 . 즉, 호환성 라이브러리 (예 : FragmentManager 대신 SupportFragmentManager)를 사용하는 경우 XML 애니메이션 파일의 구문이 다릅니다.


다음은 프래그먼트 간 슬라이드 인 / 아웃 애니메이션입니다.

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.animator.enter_anim, R.animator.exit_anim);
transaction.replace(R.id.listFragment, new YourFragment());
transaction.commit();

우리는 objectAnimator를 사용하고 있습니다.

다음은 애니메이터 하위 폴더 에있는 두 개의 xml 파일입니다 .

enter_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
     <objectAnimator
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:duration="1000"
         android:propertyName="x"
         android:valueFrom="2000"
         android:valueTo="0"
         android:valueType="floatType" />
</set>

exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-2000"
        android:valueType="floatType" />
</set>

나는 그것이 누군가를 도울 수 있기를 바랍니다.


잡힌 다른 사람은 트랜잭션을 빌드 할 때 바꾸거나 추가하기 전에 setCustomAnimations가 호출되는지 확인하십시오.


FragmentTransaction의 Android SDK 구현은 Animator지원 라이브러리가 원하는 동안 원합니다. Animation왜 그런지 묻지 않지만 strangeluk의 의견 후에 android 4.0.3 코드 및 지원 라이브러리를 살펴 보았습니다. Android SDK 사용 loadAnimator()및 지원 라이브러리 사용loadAnimation()


이 간단하고 빠른 솔루션을 사용해보십시오. 안드로이드는 기본 설정을 제공합니다 animation.

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

산출:

여기에 이미지 설명을 입력하십시오

참고 URL : https://stackoverflow.com/questions/4932462/animate-the-transition-between-fragments

반응형