개발일지

Android in A..Z - View (MeasureSpec) 본문

Android (안드로이드)/View

Android in A..Z - View (MeasureSpec)

강태종 2021. 4. 29. 17:27

MeasureSpec

MeasureSpec은 View의 크기를 정할 때 중요하게 쓰인다. MeasureSpec은 ParentView에서 ChildView로 전달되며 크기에 대한 정보와 MeasureSpec Mode에 대한 정보로 구성되어 있다.


MeasureSpec Mode

  • UNSPECIFIED : Mode가 설정되지 않은 경우며 원하는 크기를 가질 수 있다.
  • EXACTLY : 정확한 사이즈가 정해진 상태며 정해진 사이즈 안에서 원하는 크기를 가질 수 있다. (match_parent, fill_parent, 500dp 등 정확한 사이즈가 정해진 경우에 할당된다.)
  • AT_MOST : 주어진 사이즈에서 원하는 크기를 가질 수 있다. (wrap_content로 주어진 경우 할당된다.) 

MeasureSpec 사용

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        var w = MeasureSpec.getSize(widthMeasureSpec)
        var h = MeasureSpec.getSize(heightMeasureSpec)
        val widthMode = MeasureSpec.getMode(widthMeasureSpec)
        val heightMode = MeasureSpec.getMode(heightMeasureSpec)

        when {
            (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) && (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) -> {
                w = (100 * resources.displayMetrics.density + 0.5).toInt()
                h = (100 * resources.displayMetrics.density + 0.5).toInt()
            }
            widthMode == MeasureSpec.EXACTLY && (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) -> {
                h = w
            }
            (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) && heightMode == MeasureSpec.EXACTLY -> {
                w = h
            }
        }

        setMeasuredDimension(w, h)
    }

getSize와 getMode로 MeasureSpec으로 부터 값과 모드를 얻을 수 있다.

 

int newWidthSpec = MeasureSpec.makeMeasureSpec( widthPixels, widthMode  );

makeMeasureSpec으로 새로운 MeasureSpec을 만들 수 있다.


Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/CustomView

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

Comments