프래그먼트 간 전환 애니메이션
조각 사이의 전환을 애니메이션하려고합니다. 다음 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 메소드를 필요로 기억 자신의 생성 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 / 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
'Programing' 카테고리의 다른 글
선택적 경로 매개 변수가있는 반응 라우터 (0) | 2020.03.27 |
---|---|
Bash에 TRY CATCH 명령이 있습니까? (0) | 2020.03.27 |
Nodejs npm은 최신 버전의 패키지를 보여줍니다 (0) | 2020.03.27 |
CNTLM과 함께 프록시 뒤에서 pip 사용 (0) | 2020.03.27 |
React를 사용하여 브라우저 크기 조정의 렌더링 뷰 (0) | 2020.03.27 |