반응형
조각 트랜잭션 애니메이션이 완료된 후 작업 수행
애니메이션이 끝난 후 버튼 가시성을 설정하고 싶습니다.
이것이 애니메이션이라고 부르는 것입니다.
android.support.v4.app.FragmentTransaction fAnimation = this.getActivity().getSupportFragmentManager().beginTransaction();
fAnimation.setCustomAnimations(android.R.anim.slide_in_left, R.anim.pull_out_to_left);
if (this.isVisible()) {
fAnimation.hide(this);
fAnimation.commit();
}
// code that will be executed when the fragment is gone (after the animation is over)
내 조각이 사라진 때를 알기 위해 리스너를 첨부하는 방법이 있습니까?
@nmw가 그의 답변에서 구현하는 애니메이터는 API 레벨 11에 추가되었으며 Android 지원 라이브러리에서 구현 한 Fragments에서는 작동하지 않습니다.
Fragment 애니메이션 이벤트를 수신하기 위해 지원 라이브러리의 Fragment
클래스를 확장 하고을 덮어 쓰고 onCreateAnimation
사용자 지정 AnimationListener를 반환 된 Animation 객체에 연결했습니다.
public class MyFragment extends android.support.v4.app.Fragment {
private static final String TAG = "MyFragment";
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
Animation anim = AnimationUtils.loadAnimation(getActivity(), nextAnim);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.d(TAG, "Animation started.");
// additional functionality
}
@Override
public void onAnimationRepeat(Animation animation) {
Log.d(TAG, "Animation repeating.");
// additional functionality
}
@Override
public void onAnimationEnd(Animation animation) {
Log.d(TAG, "Animation ended.");
// additional functionality
}
});
return anim;
}
}
Fragment를 하위 클래스로 만들고 onCreateAnimator를 재정의 한 다음 XML에서 해당 애니메이션을로드하고 리스너를 연결할 수 있습니다.
예
public class MyFragment extends Fragment
{
@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)
{
final int animatorId = (enter) ? R.anim.in_anim : R.anim.out_anim;
final Animator anim = AnimatorInflater.loadAnimator(getActivity(), animatorId);
anim.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationStart(Animator animation)
{
...
}
@Override
public void onAnimationEnd(Animator animation)
{
...
}
});
return anim;
}
위의 답변을 결합하면 지원 라이브러리 조각과 함께 성공적으로 사용하는 샘플이 있습니다.
MenuFragment를 확장하고 나중에 실행할 콜백을 받도록 리스너를 설정하기 만하면됩니다.
public class MenuFragment extends Fragment {
private WeakReference<OnMenuClosedListener> onMenuClosedListener;
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
Animation anim = null;
if (enter) {
anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_slide_in_top);
} else {
anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_menu_slide_out_top);
anim.setAnimationListener(new AnimationListener() {
@Override public void onAnimationStart(Animation animation) {
}
@Override public void onAnimationRepeat(Animation animation) {
}
@Override public void onAnimationEnd(Animation animation) {
onMenuClosed();
}
});
}
// NOTE: the animation must be added to an animation set in order for the listener
// to work on the exit animation
AnimationSet animSet = new AnimationSet(true);
animSet.addAnimation(anim);
return animSet;
}
private void onMenuClosed() {
if (this.onMenuClosedListener != null) {
OnMenuClosedListener listener = this.onMenuClosedListener.get();
if (listener != null) {
listener.onMenuClosed();
}
}
}
public void setOnMenuClosedListener(OnMenuClosedListener listener) {
this.onMenuClosedListener = new WeakReference<MenuFragment.OnMenuClosedListener>(listener);
}
/**
* Callback for when the menu is closed.
*/
public static interface OnMenuClosedListener {
public abstract void onMenuClosed();
}
}
API 26 (및 지원 라이브러리)에 추가되어 사용할 수 있습니다.
FragmentTransaction runOnCommit (Runnable runnable);
예를 들면 :
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_from_left);
ft.show(YourFragment);
ft.commit();
ft.runOnCommit(() -> Your_Action_Here);
Xamarin에서이 작업을 수행해야했습니다. 내 상황은 조각 애니메이션이 끝나면 콜백이 필요했습니다. 다음은 깜박임없이 작동하도록 만든 방법입니다 (이것은 C # / Xamarin입니다).
public override Animation OnCreateAnimation(int transit, bool enter, int nextAnim)
{
Animation anim = base.OnCreateAnimation(transit, enter, nextAnim);
if (anim == null && nextAnim != 0) {
anim = AnimationUtils.LoadAnimation(Activity, nextAnim);
}
anim.SetAnimationListener(this);
return anim;
}
public void OnAnimationEnd(Animation animation)
{
}
public void OnAnimationRepeat(Animation animation)
{
}
public void OnAnimationStart(Animation animation)
{
}
노트 :
- 부모 조각은
Animation.IAnimationListener
AnimationSet
그렇지 않으면를 반환해야합니다.FragmentManager
그러면 리스너가 재정의되고 콜백이 실행되지 않습니다.
반응형
'IT이야기' 카테고리의 다른 글
Android에서 나침반 방위 / 방향 계산 (0) | 2021.04.27 |
---|---|
부분 문자열의 Javascript getElementById 기반 (0) | 2021.04.27 |
특정 지점을 중심으로 정점을 회전하는 방법 (0) | 2021.04.27 |
데이터베이스 크기가 2GB보다 크면 SQLite 성능이 저하? (0) | 2021.04.26 |
Express.js의 MEAN 스택 역할 (0) | 2021.04.26 |