programing

조각 간의 전환을 애니메이션화합니다.

oldcodes 2023. 8. 12. 10:40
반응형

조각 간의 전환을 애니메이션화합니다.

조각들 사이의 전환을 애니메이션화하려고 합니다.저는 다음과 같은 답변을 받았습니다.
Android 단편 및 애니메이션

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)

아이디어 있어요?허니콤 API 참조를 확인했을 때translate거기에 있습니까.내가 뭘 놓친 거지?
조각 간의 전환을 애니메이션화할 수 있는 다른 방법이 있습니까?감사해요.

새 기능을 사용해야 합니다.android.animation프레임워크(개체 애니메이터):FragmentTransaction.setCustomAnimations게다가FragmentTransaction.setTransition.

다음은 사용에 대한 예입니다.setCustomAnimationsApiDemos의 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속성, 그러나 일반적으로 슬라이드에는 화면에서 또는 화면에서 컨텐츠를 애니메이션화하는 작업이 포함됩니다.상대적인 값을 사용하는 전환 속성은 없는 것으로 알고 있습니다.하지만, 이것이 여러분이 직접 그것들을 쓰는 것을 막지는 못합니다.속성 애니메이션에는 애니메이션을 만들 객체(이 경우 보기)에 대해 더 나은 방법과 더 나은 방법이 필요하므로 자신만의 방법을 만들 수 있습니다. getXFraction그리고.setXFraction다음과 같은 보기 하위 클래스의 메서드:

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

리소스와 연결된 애니메이션 폴더에 애니메이션 4개를 추가해야 합니다.

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

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

출력:

enter image description here

됐습니다.

롤리팝과 나중에 자신을 묶을 수 있는 여유가 있다면, 이것은 효과가 있는 것처럼 보입니다.

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

코틀린 버전:

f = MyFragment().apply {
    enterTransition = Slide(Gravity.END)
    exitTransition = Slide(Gravity.START)
}
fragmentManager
    .beginTransaction()
    .replace(R.id.content, f, FRAG_TAG)  // FRAG_TAG is the tag for your fragment
    .commit();

이게 도움이 되길 바랍니다.

누릭의 대답은 큰 도움이 되었지만, 이것을 발견할 때까지 그것을 작동시킬 수 없었습니다.즉, 호환성 라이브러리(예: 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();

개체 애니메이터를 사용하고 있습니다.

다음은 애니메이터 하위 폴더에 있는 두 개의 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를 호출하기 전에 트랜잭션을 작성할 때 교체/추가해야 합니다.

이 간단하고 빠른 솔루션을 사용해 보십시오.는 일부 Android를 합니다.animations의

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

출력:

enter image description here

Android SDK의 Fragment Transaction 구현은 다음을 원합니다.Animator는 지원라러원하동안는가리이브▁an▁wants를 원합니다.Animation이유는 묻지 마십시오. 하지만 이상한룩의 의견 이후 안드로이드 4.0.3 코드와 지원 라이브러리를 조사했습니다.는 Android SDK를 합니다 »loadAnimator()는 라브러사지를 사용합니다.loadAnimation()

이 오래된 질문에 보다 현대적인 답변을 추가하기 위해 재료 설계로 이동한 경우 제공된 모션 라이브러리(자세한 내용은 https://material.io/develop/android/theming/motion 참조)를 사용하여 쉽게 수행할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4932462/animate-the-transition-between-fragments

반응형