디지털 이미지를 저장하는 데 쓰이는 이미지 파일 포맷 또는 메모리 저장방식의 한 형태이다.

안드로이드에서 시스템 갤러리 어플리케이션의 사진은 기기의 화면밀도보다 해상도가 훨씬 높다.

메모리가 크지않은 환경에서 해당 이미지로 작업을 하게 되면 상당히 큰 메모리를 사용하기 때문에 효율적이지 않다. 이런 경우에는 해상도를 낮춰서 메모리에 로드하는것이 효율적이다.

(저해상도 버전은 UI구성요소의 크기와 일치해야 한다.)

그렇기 때문에 작게 서브 샘플링한 버전을 메모리에 로드하여 메모리 제한을 초과하지 않고 큰 비트맵을 디코딩하는것이 바람직하다.


비트맵 크기 및 유형값 구하기 (해당 비트맵을 메모리에 로드하지 않고 사이즈 구하는 방법)

val options = BitmapFactory.Options().apply {
    inJustDecodeBounds = true
}
BitmapFactory.decodeResource(resources, R.id.myimage, options)
val imageHeight: Int = options.outHeight
val imageWidth: Int = options.outWidth
val imageType: String = options.outMimeType

해당 이미지를Bitmap으로 만들기위해서는 decodeByteArray(), decodeFile(), decodeResource() 등

의 메서드를 사용하는데 해당 메소드들은 생성된 비트맵에 메모리를 할당하기 때문에 OutOfMemory예외가 발생할 수 있다. 메모리 할당을 방지하는 방법에는 BitmapFcatory.Options Class의 inJustDecodeBounds값을 true로 설정해주는 방법이 있다.


축소 버전을 메모리에 로드

이미지 크기를 알면 전체 이미지를 메모리에 로드할것인지 서브샘플링된 버전을 대신 로드할것인지 결정할 수 있다.

고려해야 하는 요소

  1. 전체 이미지를 메모리에 로드할 때 예상되는 메모리 사용량
  2. 어플리케이션의 다른 메모리 요구사항을 고려하여 해당 이미지를 로드하는데 사용할 수 있는 메모리 용량
  3. 이미지가 로드되는 ImageView또는 UI구성요소의 크기
  4. 현재 기기의 화면 크기 및 밀도

1024x768px의 이미지를 128x96px의 ImageView에 로드 한다면 1024x768px의 이미지를 메모리에 로드하는것은 바람직하지 않다.


inSampleSize

2048x1536px의 해상도를 줄여 더 낮은 px의 비트맵을 생성할 수 있다.

ex)inSampleSize = 4인 경우 2048x1536의 해상도를 512x384의 크기의 비트맵을 생성한다.

12MB의 이미지를 0.75MB의 크기로 줄일 수 있음.

Array

val array = arrayOf(0,1,2,3) → 한번 선언하고 나면 배열의크기가 4로 정해지게된다.

수정이나 삭제가 불가능하다.

array.add (x) array.remove(x)

 

ArrayList (MutableList)

val arrayList = arrayListOf(0,1,2,3) → Array와 달리 크기의 변경이 가능하고 값을 변경할 수 있다.

arrayList.add(4) (o), arrayList.remove(0)

 

**mutableList와 ArrayList의 차이점

MutableList → Interface, 인스턴스를 만들 수 없음

ArrayList → 추상 Class, 인스턴스를 만들 수 있음

방법1

//화면 절전모드 해제 ---1
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

//화면 절전모드 해제 취소 ---2
window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

 

화면 절전모드 해제를 하는 경우 해당 Activity에 있는동안은 화면이 계속 켜진다.

화면 절전모드 해제 취소를 하는 경우엔 절전모드가 해제된다.

화면이 절전이 된 상태에서 해당 코드를 실행하면 화면이 다시 밝아짐

해당 Activity가 종료되면 다시 기기설정을 따름


방법2

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
android:keepScreenOn="true">
        ...
    </RelativeLayout>

해당 Activity의 xml에 keepScreenOn=”true”값을 설정해 준다.


특징

이 접근 방식의 장점은 wake lock(CPU를 켜진 상태로 유지 참조)과 달리 특정 권한이 필요하지 않고 앱이 사용하지 않는 리소스를 해제할 필요 없이 사용자가 애플리케이션 간에 이동할 수 있도록 플랫폼이 올바르게 관리한다는 것입니다.


참고

실행 중인 애플리케이션에서 계속 화면이 켜져 있을 필요가 없다면(예를 들어, 특정 시간 동안 활동이 없을 때 화면을 타임아웃하려는 경우) FLAG_KEEP_SCREEN_ON플래그를 삭제하지 않아도 됩니다. 창 관리자는 앱이 백그라운드로 이동하거나 포그라운드로 돌아갈 때 올바른 작업을 하도록 확인합니다. 하지만, 명시적으로 플래그를 삭제하여 화면이 꺼지도록 하려면 다음과 같이 clearFlags() 를 사용합니다. getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

'Android개발 > Kotlin' 카테고리의 다른 글

[Android][Kotlin]Bitmap  (0) 2025.04.30
[Android][Kotlin]Array와 ArrayList 차이  (0) 2025.04.30
[Android][Kotlin]View의 Height구하기  (0) 2025.04.30
[Android][Kotlin]SpannableString  (0) 2025.04.30
[Android][Kotlin]Hilt  (0) 2025.04.30

binding.view.layoutParams.height → layoutParams를 입력하지 않고 binding.view.height만을 입력하는 경우 0이 출력됨

textView의 경우에는 binding.textView.lineHeight를 사용해야 해당 TextView의 높이를 구할 수 있다.

//화면상에 보여지는 절대값 Screen Height값
fun getScreenHeight(context: Context): Int {
    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
		//R: API Level30 (Android11)
    return if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.R) { 
        val windowMetrics = wm.currentWindowMetrics
		val insets = windowMetrics.windowInsets
					  .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
        windowMetrics.bounds.height() - insets.bottom - insets.top
    } else { //Android11 이하
        val displayMetrics = DisplayMetrics()
        wm.defaultDisplay.getMetrics(displayMetrics)
        displayMetrics.heightPixels
    }
}

+ Recent posts