반응형
무하지
무하지
무하지
전체 방문자
오늘
어제
  • 분류 전체보기
    • 알고리즘
      • 알고리즘+자료구조
      • 문제풀이
    • Python
      • 머신러닝
    • 운영체제
    • Javascript
    • React
    • C#
    • C++
    • Java
    • Kotlin
    • 수학
      • 통계학
    • 기타
    • Computer Science

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
무하지

무하지

Kotlin

[Kotlin] ConstraintLayout 동적으로 제어하기

2021. 9. 13. 13:34
반응형

 

constraintlayout을 코틀린에서 런타임에 동적으로 제어해보자.

이때 binding은 뷰 바인딩 인스턴스이다.

 

  • 전체코드
val constraintLayout = binding.root
val constraintSet = ConstraintSet()
constraintSet.clone(constraintLayout)
constraintSet.connect(binding.eyes.id, ConstraintSet.TOP, binding.face.id, ConstraintSet.TOP, 200)
constraintSet.connect(binding.eyes.id, ConstraintSet.START, binding.face.id, ConstraintSet.START, 10)
constraintSet.applyTo(constraintLayout)

 

eyes를 face의 TOP으로부터 200만큼, face의 START로부터 10만큼 떨어지게 했다.

다만 코드상에서는 XML과 달리 단위가 무조건 픽셀이다. 따라서 dp로 바꿔줄 필요가 있다. 아래는 dp를 픽셀 단위로 바꿔주는 함수이다.

 

fun convertDpToPixel(dp: Float, context: Context): Int {
        return (dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)).toInt()
}

 

쓰일 일이 많을 것 같아 이를 좀 더 일반화해서 함수로 만들어봤다.

private fun constraintWidget(constraintLayout: ConstraintLayout, target: Int, standard: Int, startMargin: Float, topMargin: Float) {
    val constraintSet = ConstraintSet()
    constraintSet.clone(constraintLayout)
    constraintSet.connect(target, ConstraintSet.START, standard, ConstraintSet.START, convertDpToPixel(startMargin, this))
    constraintSet.connect(target, ConstraintSet.TOP, standard, ConstraintSet.TOP, convertDpToPixel(topMargin, this))
    constraintSet.applyTo(constraintLayout)
}

private fun convertDpToPixel(dp: Float, context: Context): Int {
    return (dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)).toInt()
}

 

  • 사용
constraintWidget(binding.root, binding.eyes.id, binding.face.id, 36f, 56f)

root 레이아웃에서 eyes 위젯을 face를 기준으로 start에서 36dp, top에서 56dp 마진을 갖게 제약한다.

반응형

'Kotlin' 카테고리의 다른 글

[안드로이드 스튜디오] tablayout의 tabitem 사용시 java.lang.NullPointerException: Missing required view with ID  (0) 2021.09.14
[안드로이드 스튜디오] Missing contentDescription attribute on image  (0) 2021.09.13
[Android Studio] Hardcoded string "muyaho", should use '@string' resource  (0) 2021.09.13
[Kotlin] findViewById & kotlin-android-extensions & viewBinding  (0) 2021.09.13
    'Kotlin' 카테고리의 다른 글
    • [안드로이드 스튜디오] tablayout의 tabitem 사용시 java.lang.NullPointerException: Missing required view with ID
    • [안드로이드 스튜디오] Missing contentDescription attribute on image
    • [Android Studio] Hardcoded string "muyaho", should use '@string' resource
    • [Kotlin] findViewById & kotlin-android-extensions & viewBinding
    무하지
    무하지

    티스토리툴바