[Android/Kotlin/Tip] Status Bar Transparent - 상태창 투명

Notepad96

·

2022. 8. 29. 17:20

300x250

 

 

1. 설명

 

결과

 

이번 글에서는 최상단에서 시간 및 배터리를 표시하는 상태 바(Status Bar)를 투명하게 만드는 방법에 관하여 기술한다.

 

 

상태 바를 투명하게 만듦으로써 위 결과 화면에서 보이는 것처럼 레이아웃에 나타낸 이미지가 상태 바까지 포함되어 그려지는 것을 확인할 수 있다.

 

 

 

 

 activity_main.xml

메인 레이아웃으로서 ImageView 1개와 TextView 1개로 구성하였다.

 

상단의 위치한 ImageView서 scaleType으로 fitXY를 줌으로써 지정한 크기의 맞게 이미지 사이즈를 변환하여 나타내 주며, 상태 바를 투명하게 함으로써 상태바 영역에서도 이미지가 나타나도록 할 수 있다.

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity"
    android:id="@+id/linearLayout">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:scaleType="fitXY"
        android:src="@drawable/bread" />

    <TextView
        android:id="@+id/textView01"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:text="오늘의 빵"
        android:textStyle="bold"
        android:textSize="24sp" />

</LinearLayout>

 


 

 MainActivity.kt

SDK 버전에 따라 적용해주어야 하는 것들이 다르다.

 

window 객체는 화면을 그리는데 관여하는 객체로서 전반적인 동작을 말하자면 window 객체의 Flag와 같은 속성 값을 변경함으로써 상태 바를 투명한 상태로 만든다.

 


import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import com.example.tipexample.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        if(Build.VERSION.SDK_INT >= 19) {
            window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            if(Build.VERSION.SDK_INT < 21) {
                setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true)
            } else {
                setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)
                window.statusBarColor = Color.TRANSPARENT
            }
        }
    }

    private fun setWindowFlag(bits: Int, on: Boolean) {
        val winAttr = window.attributes
        winAttr.flags = if(on) winAttr.flags or bits else winAttr.flags and bits.inv()
        window.attributes = winAttr
    }
}

 

 


 

 액션바 제거

보통 상태 바 아래에 배치되는 액션 바 혹은 타이틀 바라고 불리는 이것을 지우기 위해서는 themes 파일에서 parent를 변경해주면 간단하게 제거 가능하다.

 

themes.xml

 

 

300x250