답변:
프래그먼트 간 전환에 애니메이션을 적용하거나 프래그먼트를 표시하거나 숨기는 프로세스에 애니메이션을 적용하려면을 사용하여을 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의 대답을 살펴보십시오 .
그러나 지원 라이브러리 를 사용하려면 아래에 설명 된대로 이전 애니메이션 프레임 워크를 사용해야합니다.
Reto 와 blindstuff의 답변을 참조한 후 다음 코드가 작동했습니다.
조각을 다시 누르면 오른쪽 에서 미끄러 져 왼쪽으로 미끄러 져 나타납니다 .
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_left 및 android.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