본문 바로가기

구글과인터넷/안드로이드

안드로이드 화면전환효과 관련 (효과, 효과없애기)

액티브 뷰 페이지 효과 제거

public void onCreate(...)

 {

     //뷰보이기 효과 아무것도 효과 없애기

     getWindow().setWindowAnimations(0);
 }


페이지 효과가 싫으면 토스트 효과로 부드럽게 보이도록 할수있다.

//뷰페이지가 토스트 효과로 보이게 하기

getWindow().setWindowAnimations(android.R.style.Animation_Toast);


출처: http://www.androidpub.com/1174963

startActivity(intent);
overridePendingTransition(int, int);

이런식으로 액티비티 실행시에 효과를 줄 수 있다는데 반대로 효과를 없이 화면전환 하려면 어떻게 하나요?

 
댓글
2011.01.04 11:42:07
zihen
overridePendingTransition(0, 0); 주시면 됩니다.
댓글
2011.01.04 12:46:39
stan
엇그거 해봤는데 애니메이션 있던데요;
댓글
2011.01.04 13:31:10
zihen
전 이거로 잘 쓰고 있는데요;
댓글
2011.01.04 19:53:19
stan
아; 현재 액티비티에 설정되있던것 때문에 애니메이션이 있던거네요 ㅎㅎ
감사합니다^^


//////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://androiddeveloper.tistory.com/71

Android - Page move ( 한 Activity에서 페이지 이동효과 주기 )

Android 2011/10/31 15:14

Intent를 이용하여서 두개이상의 엑티비티화면 이동을 전에 살펴보았습니다.
그 때는 자바 파일 하나당 하나의 Activity를 설정하여 그 Activity간의 이동으로 화면이동을 해보았습니다.
오늘 살펴볼 내용은 한 자바파일의 한 Activity에서 화면페이지를 넘기는 듯한 효과를 주는 것입니다.
말그대로 한 Activity안에 여러가지 내용을 적지만 적은 내용중에 몇개는 숨기고 있다가
특정 이벤트가 일어나면 보았던 내용은 숨기고 다른 내용을 보여주는 식으로 페이지 효과를 주는 것입니다.
한 자바파일 한 Activity내에서 여러가지 내용을 다루기때문에 소스 코딩 내용이 늘어나고 복잡해집니다.
상황에 따라 이용하시는 것이 좋을 듯 합니다.

어떤식으로 할거냐면 한 엑티비티 안에 여러개의 레이아웃을 설정해놓고 그 레이아웃들에 버튼을 하나씩 연결
그래서 해당 버튼을 누를 때 해당 레이아웃을 보여주는 식으로 할 것입니다.
레이아웃을 3개 더 추가하였다면 버튼도 그에 맞게 3개를 추가하여 하나씩 대웅하게 이벤트를 걸어주는 것이지요.

레이아웃1 = > 버튼 1
레이아웃2 = > 버튼 2
레이아웃3 = > 버튼 3

이런식이 되겠네요 ㅎ

이 방법에서 사용할 때 레이웃에 속성 중에 
setVisibility() 값을 사용하게 됩니다.
레이아웃을 보여주느냐 안보여주느냐를 해당 속성값을 이용하는데요
GONE 을 주면 숨기고 VISIBLE 을 주면 보여지게 되는 것을 이용합니다.

그러면 소스코딩을 하면서 살펴보겠습니다.


프로젝트 생성

Project name : ExamScreen
Build Target : Android 2.1
Package name : jsh.exam.screen
Create Activity : main
Min SDK Version : 7

/////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://www.androidpub.com/1385434


안녕하세요. 

안드로이드의   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를  호출하는 곳에   

1.startActivity(i);
2. 
3.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 에  추가된 코드입니다.

01.@Override
02.public boolean onKeyDown(int keyCode, KeyEvent event) {
03. 
04.switch (keyCode) {
05.case KeyEvent.KEYCODE_BACK:
06.return true;
07.}
08.return super.onKeyDown(keyCode, event);
09.}
10. 
11.@Override
12.public boolean onKeyUp(int keyCode, KeyEvent event) {
13. 
14.switch (keyCode) {
15.case KeyEvent.KEYCODE_BACK:
16.Intent i = new Intent(this,  되돌아갈Activity.class);
17.i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
18.startActivity(i);
19. 
20.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
21. 
22.finish();
23.return true;
24. 
25.}
26. 
27.return super.onKeyUp(keyCode, event);
28.}


안드로이드에  기본으로  없는  Animation  xml 코드 


slide_in_right.xml

1.<?xml version="1.0" encoding="utf-8"?>
2. 
4.<translate android:fromXDelta="50%p" android:toXDelta="0"
5.android:duration="@android:integer/config_mediumAnimTime"/>
6.<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
7.android:duration="@android:integer/config_mediumAnimTime" />
8.</set>


slide_out_left.xml

1.<?xml version="1.0" encoding="utf-8"?>
2. 
4.<translate android:fromXDelta="0" android:toXDelta="-50%p"
5.android:duration="@android:integer/config_mediumAnimTime"/>
6.<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
7.android:duration="@android:integer/config_mediumAnimTime" />
8.</set>




이 방법을  이용하시면  Back key 에서도 일관된  Activity 전환 효과를 내실 수는 있습니다만, 


Back Key 를  후킹하는 코드를  적절하게 수정해 주셔야 한답니다. 


감사합니다. 


PS :  아이디어를 제공해 주신 아즈라엘님께 감사드립니다 ^^


 
댓글
2011.03.22 09:44:07
볼레로
그림 안뜨고,  앞에  소스 코드 추가하는 란이 추가되었는데  삭제가 안되네요.
댓글
2011.03.22 10:08:36
id: 아즈라엘아즈라엘
그림 안되더군요..저도 파일 추가로 이미지 넣었습니다. 
꼼수의 단점이 예상치 못한 에러도 동반한다는건데.. 에러 없이 잘된다면.. 이것도 좋은 예시가 될거 같습니다..
볼레노님 덕분에 저도 나중에 사용할수 있는 테스트 어플이 생긴거 같네요..^^
소스라인과 설명이 깔끔하네요 감사합니다. ~!
댓글
2011.03.22 11:03:20
초보개발자
종료되는 액티비티의 finish() 호출 후에 overridePendingTransition() 을 호출하면 됩니다.
startActivity()를 호출하지 않아도 되요.

댓글
2011.03.22 11:10:01
볼레로
두분 감사드립니다. 

이 방법 한참 찾았거든요 ^^
댓글
2011.03.23 09:52:43
개굴딱지

전에 써봤던 방법이긴 한데, 이렇게 정리를 해주시니 담엔 좀더 편하게 참고할 수 있겠네요.
제가 참 단순하고 기억력이 나빠서, 매번 지난 소스 찾아봐야 해서 귀찮았었는데.. 감사 드립니다.

댓글
2011.03.25 16:41:36
커니
뒤로가기 키를 오버라이드하는건 onBackPressed()를 사용하면 더 깔끔할 것 같네요 ㅎㅎ
그리고 단순 인텐트 호출로 액티비티를 전환하는 것이니.. 액티비티 스택 관리에 신경을 더 쓰면 완변할 것 같습니다 :)


//////////////////////////////////////////////////////////////////////////////////////////////

출처: http://dotndotandroid.blogspot.kr/2011/05/activity-overridependingtransition.html

Activity 변경 애니메이션 효과 - overridePendingTransition

안드로이드 2.0 ( api level 5 ) 부터 액티비티가 보여지고, 없어질때 뷰처럼 애니메이션을
설정할 수 있다.

사용법도 간단하다.
startActivity(); 를 하고, overridePendingTransition( R.anim.new_activity, R.anim.old_activity );

애니메이션이 설정되지 않은 경우는 새 액티비티는 오른쪽에서 슬라이드-인 되고,
기존 액티비티는 왼쪽으로 슬라이드-아웃 된다.

애니메이션은 기존 방식과 동일하게 res/anim 폴더에 xml 로 작성하던가,
Animation 객체를 생성해 사용해도 된다.

[ fade - animation ]

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0"
       android:duration="@android:integer/config_longAnimTime" />

[ hold - animation ]

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

[ zoom_enter- animation ]

<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator">
    <scale android:fromXScale="2.0" android:toXScale="1.0"
           android:fromYScale="2.0" android:toYScale="1.0"
           android:pivotX="50%p" android:pivotY="50%p"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

[ zoom_exit - animation ]

<set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:zAdjustment="top">
    <scale android:fromXScale="1.0" android:toXScale=".5"
           android:fromYScale="1.0" android:toYScale=".5"
           android:pivotX="50%p" android:pivotY="50%p"
           android:duration="@android:integer/config_mediumAnimTime" />
    <alpha android:fromAlpha="1.0" android:toAlpha="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
</set>


///////////////////////////////////////////////////////////////////////////////

출처: http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=12294


안드로이드 공부하시는 분들은 자신이 만든 어플리케이션이 멋지게 작동하는걸 원하실 겁니다.
그중에하나가 에니메이션이죠.
그런데 에니메이션 하면 보통 ViewFlipper 를 많이들 생각하실겁니다.
하지만 ViewFlipper는 뷰를 컨트롤하는거지 Activity간의 에니메이션을 컨트롤하지는 않습니다.

그래서 있는것이 overridePendingTransition 입니다.

사용 예) overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);


인텐트로 넘어갈때 써주시면 됩니다.
다만 아셔야 할것이 있습니다.
이것은 안드로이드 버전과 관련이있더군요.
제가 1.5로 어플을 만드는데 처음에 이걸썻다가 오작동 혹은 오류가 뜨길래 잘못된 정보인줄 알았습니다만,
2.1로 만든 어플에서는 작동이 되었습니다.

아무튼 Activity간의 이동시에 에니메이션을 추가하고싶으시면 overridePendingTransition를 써주시면 됩니다.


////////////////////////////////////////////////////////////////////////////////////////


출처: http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=15755

다 아시느분도 게시공 도움이 될지 모르겟지만 혹시나 모르시는분들을 위해 올려봄니다^^
보통 화면 전화시에 화면이 기존 화면에서 옆으로 넘어가는 형식의 화면이 전환이 되는데 
이렇게 하시면 액티비티간 화면 전환시 좀더 부드럽고 다양하게 화면 전환 효과를 줄수 있습니다

-res폴더 밑에 anim폴드 생성 
-anim폴더안에 fade.xml,hold.xml 넣기
*fade.xml*

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="0.0" android:toAlpha="1.0"
       android:duration="@android:integer/config_longAnimTime" />

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

-이동전 액티비티의 소스코드에서 다음 액티비티호출하는 부분 startActivity(intent)
밑에 다음 코드를 넣어준다
overridePendingTransition(R.anim.fade,R.anim.hold);
넣어주면 넘어갈때 기존의 화면전환과 다르게 사라지면서 새로운 액티비티로 전환

참고로 이건 1.6버전에서는 가능하지 않더라고요^^

허접한 팀이지만 도움이 되었으면 합니다^^ ㅋㅋㅋㅋㅋ


/////////////////////////////////////////////////////////////////////////////////

출처: http://foobarpig.com/android-dev/how-to-disable-animation-on-startactivity-finish-and-backpressed.html

Disabling Activity “slide” animation on StartActivity, Finish() and BackPressed

This post is about Android development, because I’m currently doing both. Hopefully this year I’ll have enough time to update my blog more frequently. Anyway, back to programming: how to disable “slide” animation on various Activity related events.

Disable animation on StartActivity

Before starting your activity, you have to set flag FLAG_ACTIVITY_NO_ANIMATION to your Intent.

1
2
3
4
Intent myIntent = new Intent();
myIntent.setClassName(this, ExampleActivity.class.getName());
myIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(myIntent);

Unfortunately, this will not disable animations caused by back button or, if you’ve started SubActivity, on finish().

Disable animation on finish() and back button pressed

After your finish() function put overridePendingTransition(0, 0):

1
2
3
4
Intent resultIntent = new Intent();
setResult(Activity.RESULT_OK, resultIntent);
finish();
overridePendingTransition(00);

Same function helps with handling back button animation. Just override onBackPressed in your activity

1
2
3
4
5
@Override
public void onBackPressed() {
this.finish();
overridePendingTransition(00);
}

Tags: 

4 responses

  1. Posted March 7, 2011 at 17:59 | Permalink

    I have noticed that the onBackPressed() implementation does not always work. For me I still get a swipe for TabActivities.

    To overcome this I put the older (legacy) approach in the onCreate method of the Activity that I DON’T want to animate:

    public void onCreate(Bundle savedInstanceState) {

    // Disable all animations
    getWindow().setWindowAnimations(0);
    }

  2. Posted October 17, 2011 at 23:03 | Permalink

    Thanks! Works like a charm ;)

  3. Yannick
    Posted March 20, 2012 at 15:18 | Permalink

    Thanks.

    Instead of adding overridePendingTransition(0, 0) after finish() and overriding onBackPressed(), it’s probably easier to override finish() itself:

    @Override
    public void finish() {
    super.finish();
    overridePendingTransition(0, 0);
    }

    Like this, if later you add another way to “exit” the activity by calling finish(), you don’t have the risk to forget to add the overridePendingTransition()

  4. Sam
    Posted March 28, 2012 at 06:24 | Permalink

    Awesome! Works great!