제가 지금 코딩을 제대로 하고 있는지도 모르겠네요;
뷰 전환을 이렇게 구현해도 되는걸까요?


우선 Only coding 방식이구요.
사용자 정의 뷰를 만들어 사용하고 있습니다.
현재 ViewController 라는 ViewGroup 클래스를 사용하고 있구요.
그 안에 커스텀뷰를 만들어서 사용중입니다.
(제가 코드 하이라이터를 처음 써봐서 좀 이상하네요; 분명 붙여썼는데 줄마다 공백이 들어가네요;)
(미리보기 에서만 그런거였군요;)

public class ViewController extends ViewGroup {
    MainView vMain;
    GameView vGame;
    ClearView vClear;
    GameoverView vGameover;
    enum AView { main, game, clear, gameover }
    AView aView;
    Animation fadeOut;
    Animation fadeIn;


현재 뷰컨트롤러 생성시 초기화하는 init()함수에서 객체를 만들고 처음 보여줄 Main뷰를 addView로 넣어주고 있습니다.

private void init(Context context)
 {
        aView = AView.main;

        vMain = new MainView(context);
        vGame = new GameView(context);
        vClear = new ClearView(context);
        vGameover = new GameoverView(context);

        fadeOut = new AlphaAnimation(1.0f, 0.0f);
        fadeOut.setDuration(1000);
        fadeOut.setFillAfter(true);

        fadeIn = new AlphaAnimation(0.0f, 1.0f);
        fadeIn.setDuration(1000);
        fadeIn.setFillAfter(true);
        
        this.addView(vMain);
        
        float a, b;
        a = 1.2f;
        b = 1.8f;
 }


현재는 테스트를 위해 화면을 터치하면 뷰가 전환 되는 것으로 되어있구요.
현재 뷰를 나타내는 태그가 있어서 태그를 체크하고 다음에 올 뷰를 판단해서 addView()하는 방식입니다.

    private void changeView()
    {
        switch(aView)
        {
            case main : 
                this.addView(vGame);
                this.removeViewAt(0);
                vGame.startGame();
                aView = AView.game;
                break;
            case game : 
                this.addView(vClear);
                this.removeViewAt(0);
                aView = AView.clear;
                break;
            case clear : 
                this.addView(vGameover);
                this.removeViewAt(0);
                aView = AView.gameover;
                break;
            case gameover : 
                this.addView(vMain);
                this.removeViewAt(0);
                aView = AView.main;
                break;
     }
     
     //crossDissolve(this.getChildAt(0));
     
     Log.i("Agzac", "Click");
    }


보시면 뷰를 전환할 필요가 있을 때마다 addView와 removeViewAt을 사용하고 있습니다.
사실 bringToFront()를 써봤으나 스택 내에서 인덱스는 바뀌는데 화면 갱신이 되지 않습니다.
crossDissolve는 Fadeout을 위해서 AlphaAnimation을 정의하고 뷰에 setAnimation() 하였으나
역시 갱신되지 않습니다.
ViewGroup의 child에 애니메이션을 주기 위해서는 LayoutAnimationController 를 사용해야 한다는 말도 있던데
맞는지요?

질문 요약하면
1. 지금 저 코딩이 잘 된 코딩인가요? (퍼포먼스를 고려한다면)
2. 혹시 커스텀뷰들을 만들고 그들간의 뷰전환을 한다면 보통 어떤 방식을 사용하나요?(ViewGroup 사용 유무에 관계없이)
3. 만약 ViewGroup을 사용한다면 Child View에 애니메이션을 주기 위한 방법은 무엇이 있나요?
 

lifecluee@gmail.com