안드로이드 조각 및 애니메이션 방식을 어떻게 구현해야합니까? TransactionManagerFragments를 추가하고 제거하여 자동으로 처리

예를 들어 Honeycomb Gmail 클라이언트가 사용하는 슬라이딩 방식을 어떻게 구현해야합니까?

TransactionManagerFragments를 추가하고 제거하여 자동으로 처리 할 수 있습니다. 에뮬레이터가 슬라이드 쇼이기 때문에 테스트하기가 어렵습니다 🙂



답변

프래그먼트 간 전환에 애니메이션을 적용하거나 프래그먼트를 표시하거나 숨기는 프로세스에 애니메이션을 적용하려면을 사용하여을 Fragment Manager만듭니다 Fragment Transaction.

각 Fragment Transaction 내에서 각각 표시 및 숨기기에 사용될 인 / 아웃 애니메이션을 지정할 수 있습니다 (또는 바꾸기 사용시).

다음 코드는 한 조각을 밀고 다른 조각을 그 자리에 밀어 넣어 조각을 교체하는 방법을 보여줍니다.

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

단순히 호출 ft.show하거나 호출 ft.hide할 조각을 표시하거나 표시하거나 숨길 조각을 전달 하여 동일한 작업을 수행합니다 .

참고로 XML 애니메이션 정의는 objectAnimator태그를 사용합니다 . slide_in_left의 예는 다음과 같습니다.

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


답변

지원 라이브러리를 사용할 필요가 없다면 Roman의 대답을 살펴보십시오 .

그러나 지원 라이브러리 를 사용하려면 아래에 설명 된대로 이전 애니메이션 프레임 워크를 사용해야합니다.

Retoblindstuff의 답변을 참조한 후 다음 코드가 작동했습니다.

조각을 다시 누르면 오른쪽 에서 미끄러 져 왼쪽으로 미끄러 져 나타납니다 .

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

순서가 중요합니다. 즉, setCustomAnimations()전에 전화해야 replace()애니메이션이 적용되지 않습니다!

다음으로이 파일들은 res / anim 폴더 안에 있어야 합니다.

enter.xml :

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

exit.xml :

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml :

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_exit.xml :

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

애니메이션 지속 시간은 @android:integer/config_shortAnimTime다른 숫자 와 같은 기본값으로 변경할 수 있습니다 .

프래그먼트 교체 사이에 구성 변경 (예 : 회전)이 발생하면 뒤로 동작이 애니메이션되지 않습니다. 이것은 지원 라이브러리의 개정판 20에 여전히 존재 하는 문서화 된 버그 입니다.


답변

훨씬 나은 솔루션이기 때문에 애니메이션 파일을 만드는 대신 이것을 사용하는 것이 좋습니다. Android Studio는 이미 새 XML 파일을 만들지 않고도 사용할 수있는 기본값 animation 을 제공 합니다. 애니메이션 이름은 android.R.anim.slide_in_leftandroid.R.anim.slide_out_right 이며 다음과 같이 사용할 수 있습니다.

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

산출:

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


답변

수정 된 지원 라이브러리 는 조각 전환에 View 애니메이션 (예 <translate>, <rotate>🙂 및 객체 애니메이터 (예 🙂 를 모두 사용할 수 있습니다 <objectAnimator>. NineOldAndroids 로 구현됩니다 . 자세한 내용은 github에 대한 내 설명서를 참조하십시오.


답변

나에 관해서는보기 diraction이 필요합니다.

에서-> 오른쪽에서 스 와이프

out-> 왼쪽으로 스 와이프

여기 코드가 작동합니다.

slide_in_right.xml

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

slide_out_left.xml

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

거래 코드 :

inline fun FragmentActivity.setContentFragment(
        containerViewId: Int,
        backStack: Boolean = false,
        isAnimate: Boolean = false,
        f: () -> Fragment

): Fragment? {
    val manager = supportFragmentManager
    return f().apply {
        manager.beginTransaction().let {
            if (isAnimate)
                it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)

            if (backStack) {
                it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
            } else {
                it.replace(containerViewId, this, "Fr").commit()
            }
        }
    }
}


답변

아래 방법으로 해결합니다

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment


답변