안녕하세요.
안드로이드의 Activity 간의 전환 animation 설정하는 것은 API Demos 소스에도 있습니다.
그런데, 한가지 이상한 것은 BACK key를 눌러서 돌아오는것을 적용이 안되는거 같더군요.
예들 들어, 위와 같이 3개의 Activity 가 있고,
현재 폰의 화면에는 가운데 것(Activity A)이 있구요.
화면상의 특정 버튼이나 영역을 클릭하면 , Activity B 나 C 로 이동을 하고 싶답니다.
< 안드로이드 기본 동작>
* 새로 나오는 Activity 는 화면의 오른쪽에서 시작해서 왼쪽으로 슬라이딩 효과로 나옵니다. (3번 화살표 방향)
* BACK key를 눌러서 이전 화면으로 가는 경우는 왼쪽에서 오른쪽으로 슬라이딩합니다. (4번 화살표 방향)
위 그림처럼 왼쪽에 있는 Activity는 안드로이드 기본 동작에 반대로 이동하고 싶답니다.
* 나올 때는 왼쪽에서 오른쪽으로 슬라이딩을 하고, ( 1번 화살표 방향)
* BACK key 를 눌러서 이전화면으로 갈때는 오른쪽에서 왼쪽으로 슬라이등을 하려고 합니다. ( 2번 화살표 방향)
<1번 화살표 방향 설정>
이것을 제일 간단한데요.
Activity B를 호출하는 곳에
startActivity(i); overridePendingTransition(android.R.anim.slide_in_left, R.anim.slide_out_left);
위와 같이 overridePendingTransition() 함수를 이용해서 , 전환할 효과를 지정해 주면 된답니다.
< BACK key 눌렸을 때의 설정>
그런데 문제는 BACK key 눌렸을 때의 설정을 방법이 없는 것이 도대체가 동작을 하지 않더군요.
우선 BACK key 눌렀을 때는 되돌아 가는 전화효과는 어디서 적용하는가? 못 찾았습니다.
onCreate() , onDestory(), onResume(), onPause() 어디에 코드를 추가해도 안됩니다.
여기 게시판에 질문 올렸더니 아즈라엘님이 BACK key를 후킹해서 새로 Activity 를 띄우는 것이 어떨까하고 이야기 하시더군요.
이 방법으로 시도를 해 보았는데요.
동작을 되지만, 정말 꽁수 같고, 쓸데 없는 코드가 추가되는 부작용이 생기 더군요 ㅡ.ㅡ
Activity B 에 추가된 코드입니다.
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: Intent i = new Intent(this, 되돌아갈Activity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); finish(); return true; } return super.onKeyUp(keyCode, event); }
안드로이드에 기본으로 없는 Animation xml 코드
slide_in_right.xml
<?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>
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?> <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>
이 방법을 이용하시면 Back key 에서도 일관된 Activity 전환 효과를 내실 수는 있습니다만,
Back Key 를 후킹하는 코드를 적절하게 수정해 주셔야 한답니다.
감사합니다.
PS : 아이디어를 제공해 주신 아즈라엘님께 감사드립니다 ^^
startActivity()를 호출하지 않아도 되요.
전에 써봤던 방법이긴 한데, 이렇게 정리를 해주시니 담엔 좀더 편하게 참고할 수 있겠네요.
제가 참 단순하고 기억력이 나빠서, 매번 지난 소스 찾아봐야 해서 귀찮았었는데.. 감사 드립니다.
글내용 >
우선 BACK key 눌렀을 때는 되돌아 가는 전화효과는 어디서 적용하는가? 못 찾았습니다.
onCreate() , onDestory(), onResume(), onPause() 어디에 코드를 추가해도 안됩니다.
----------------------------------------------------------------------------------------
backKey는 커니님이 말씀하신대로 onBackPressed()를 오버라이딩하면됩니다만
backKey를 눌러서 액티비티가 종료될 때에도 finish()가 호출됩니다.
여튼 모든걸 막론하고 액티비티가 종료 될때 애니메이션을 적용하고 싶으시다면
finish() 를 오버라이딩하여 overridePendingTransition() 를 호출하시면 간단하지 않을까요?