City At Night

[Android Studio] Splash! 앱의 Intro를 만들어보자 본문

Android Studio

[Android Studio] Splash! 앱의 Intro를 만들어보자

Wuny 2021. 1. 31. 01:13
728x90
반응형

Splash는 앱을 처음 시작할때 잠깐 나오는 화면을 말합니다. 

youtube를 키거나 다른 앱을 킬때 잠깐 그 회사의 로고가 나오고 앱의 메인이 나오죠.

splash 하나만으로도 앱의 Quality를 높일 수 있습니다.

 

Splash를 사용하는 방법중 여러가지 방법이 있지만 그 중 2가지를  포스팅하겠습니다.

첫 번째는 Splash의 style요소를 만들어 menifest.xml에 선언을 하는 방식과

Layout을 만들고 Handler로 Splash를 만드는 방식이 되겠습니다.

먼저 Style요소로 만드는 방법입니다.

<theme.xml>

    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/goodlogo</item>

    </style>

res -> values -> themes폴더에 theme.xml이 존재합니다.

Theme.AppCompat.NoActionBar를 해주어 액션바를 없애 전체화면으로 만들어줍니다.

drawble폴더에 미리 다운로드 해두었던  이미지를 불러 옵니다.

그 다음 SplashActivity라는 클래스를 생성합니다.

<SplashActivity.java>

public class SplashActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = new Intent(this,MainActivity.class);
        startActivity(intent);
        finish();
    }

}

먼저 이 클래스를 실행해서 Intent를 이용해 메인페이지로 넘기는 방식입니다.

SplashActivity에 대한 Layout이 있어야하는게 아닌가 라는 생각을 하실 수 있지만 

위에 작성해두었던 Splash Theme를 이 SplashActivity에 적용할것이기때문에 Layout 없이 동작할 수 있답니다. 

ㄱ그러면 Theme을 적용하기 위해서 manifest.xml에서 선언을 해줘야 합니다.

<manifest.xml>

        <activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme"
            tools:ignore="Instantiatable">

.MainActivity를 SplashActivity로 바꿔주시고 나머지 부분을 추가한 다음

<activity android:name=".MainActivity" />

메인 엑티비티도 당연히 다시 선언을 해줘야겠죠?

짜잔.~ 나타나고 메인으로 넘어가는 모습을 볼 수 있습니다 .

이 방식의 문제점은 저 이미지를 백그라운드로 지정을하였고 커스텀을 할 수 가 없습니다 .

그냥 간단하게 사용하기에는 좋지만 좋은 Quality는 보장하지는 않습니다 .

그 다음 방법이 Handler를 이용하여 splash 지속시간도 조절할 수 있는 방식입니다.

<activity_splash.xml>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/simpson">

</androidx.constraintlayout.widget.ConstraintLayout>

최상위 부모의 background를 image로 하여 splash의 레이아웃을 만들었습니다.

<SplashActivity.java>

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
        getSupportActionBar().hide();
        
        Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new splashHandler(), 2000);
    }

    private class splashHandler implements Runnable {
        @Override
        public void run() {
            startActivity(new Intent(getApplication(), MainActivity.class));
            SplashActivity.this.finish();
        }
    }

}

        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
        getSupportActionBar().hide();
        위 코드는 상태바를 없애준 코드와 액션바를 없애주는 코드로써 게임 접속할때처럼 완전한 접속화면 느낌이 나게 구현했습니다.

극그 다음 Handler를 사용했는데 현재 제 version에서 Handler는 매개변수 없는 생성자에겐 deprecated되기에 

Looper.getMainLooper()를 넣어 지정해주어야 좋습니다.

handler.postDelayed(new splashHandler(), 2000); 에서 두번째 파라미터값 2000을 지정했는데 

1초 = 1000이기에 저는 2초로 설정했습니다.

<Manifest.xml>

<activity android:name=".WebviewActivity"></activity>
        <activity android:name=".MainActivity" />
        <activity android:name=".SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity와 SplashActivity를 바꿔주어 앱 실행시 먼저 실행되게 합니다.

 

어떤가요? 확실히 Quality하나는 죽여주죠 ㅎㅎ?

728x90
반응형
Comments