본문 바로가기
프로그래밍/Android, iOS

[Android] EditText with ObjectAnimator

by YuminK 2022. 3. 30.

android에서 View에 애니메이션을 주고 싶은 경우가 생긴다.

인터넷에서 ObjectAnimator를 이용하는 방식

View.animate()... ViewPropertyAnimator를 이용하는 방식이 있다. (사용)

TranslationX, Y 값을 이용해서 이동을 시킬 수 있는데, Button이나 TextView에서는 크게 문제가 생기지 않는다.

이동한 자리에서 클릭을 해도 후처리가 자연스럽게 연결이 되는데 ...

 

EditText를 사용한 View를 애니메이션 시킨 경우에는 텍스트를 가리는 문제가 생길 수 있다.

예를 들어서 EditText View를 Y축으로 100만큼 이동을 시키면 실제 보이는 영역은 100만큼 이동을 하는데

처리되는 영역(실제 영역)은 그대로 위치를 하게 된다.

이게 100 정도의 값이면 전혀 문제가 되지 않겠지만... 예를 들어서 1000 정도를 내려간다고 하면....

우리가 입력을 하려고 하는 상황에서 입력 필드를 잘못 잡는 문제가 생긴다. 

EditText를 사용하는 목적은 키보드를 통해 입력을 받기 위함인데, 안드로이드에서 기본적으로

EditText의 영역에 맞춰서 키보드를 출력하도록 되어있다.

근데... 실제 영역과 출력 영역이 다르다면...? 키보드가 EditText를 가리게 되는 문제가 생긴다.

프로젝트 진행 중에 이러한 문제가 생겼고 그냥 애니메이션 처리 이후에 값을 셋팅해버렸다.

  val subject_anim =
            subject_text_view.animate().translationYBy(moveY)
        subject_anim.setDuration(BOTTOM_VIEW_ANIM_DURATION)
                    .setStartDelay(ITEM_DELETE_DURATION)
               .setListener(object : Animator.AnimatorListener{
                override fun onAnimationStart(animation: Animator?, isReverse: Boolean) {}
                override fun onAnimationStart(animation: Animator?) {}
                override fun onAnimationEnd(animation: Animator?, isReverse: Boolean) {
                    super.onAnimationEnd(animation, isReverse)
                }
                override fun onAnimationEnd(animation: Animator?) {
                    val layoutParams : ConstraintLayout.LayoutParams = subject_text_view.layoutParams as ConstraintLayout.LayoutParams
                    layoutParams.topMargin += subject_text_view.translationY.toInt()
                    subject_text_view.layoutParams = layoutParams
                    subject_text_view.translationY = 0F
                }
                override fun onAnimationCancel(animation: Animator?) {}
                override fun onAnimationRepeat(animation: Animator?) {}
            })

특정 뷰를 기준으로 잡아둔 TextView를 이동시키고 이후에 변경한 값(TranslationY)을 토대로 marginTop을

갱신(실제 위치 변경), TranslationY를 초기화 시킨다. (fillafter처럼)

TranslationYBy 함수는 상대적인 위치로 이동을 시키는 함수로 + 100. -100 이런 수치를 넣었다.

ConstraintLayout의 특징상 단순히 padding 혹은 margin 값만 변경을 하여도 연관이 된 모든 뷰들이 변화가

일어난다. (layoutparams). 덩어리로 모아서 부모 뷰로 처리하는 것이 편할 것 같다.

댓글