TIL231218 D21 visibility, AlphaAnimation

jericho·2023년 12월 18일

TIL

목록 보기
21/62

월요일이다. 발제가 있을 줄 알았지만 없었다. 대신 커여운 강의를 드리겠습니다. 챌린지반의 첫 강의가 있었다. 추가과제였던 회원가입 페이지의 구현에 대해 3명을 골라 발표를 시키고 튜터님의 구현을 보여주셨다. 어려운 것들은 아니라, 설명을 들으니 어느정도 이해가 갔다. UI를 어떻게 구성해야 할지 고민했던 직접 입력 선택 시 에딧텍스트 노출 기능을 튜터님은 간단하게 짜셨다. constraint layout으로 겹쳐서 구현해야 할 것이라 생각했지만, 의외로 linear horizontal 만으로 가능했다. "gone"의 동작이 내 생각과 달랐던 것이다.

visibility - visible, invisible, gone

위젯이 안보이게 하는 방법은 invisiblegone 두 가지가 있다.
invisible은 위젯은 자리를 차지하고 있지만 보이지 않게만 하는 것이고, gone은 아예 없는 취급을 하는 것이다. '없는 취급을 한다'는 것이 정말 없는 취급이어서 차지하던 자리도 사라지게 된다. 그래서 리니어 호러잔틀로 두 위젯을 병렬로 웨이트를 같게 놓고 visible/gone을 바꿔주면 그 자리를 그대로 대체하게 된다. 다만 그러면 한번 직접 입력을 선택하면 다시는 스피너를 볼 수 없다는 문제가 있지만, 도메인 적는 게 어려운 문제도 아니고 정 아니면 나갔다 들어오면 되니까. (나가는 버튼도 없는 게 함정)

오늘 새벽까지 비밀번호 검증 기능은 만들어놨고, 오늘은 강의에 이어서 과제 구현을 계속했다. 발표하신 분 중에 비밀번호 길이를 표시하신 분이 있길래 바로 채용하여 만들었고, TextWatcher를 좀 더 살펴보고 입력 무시 기능을 와쳐에서 전담하도록 통합시켰고, 커서 재설정도 beforeTextChanged의 start 값을 이용하여 조금 더 안전하고 UX가 더 좋을 수 있도록 했다. (영역 선택해서 같은 길이의 문자열로 붙여넣기했을 때 제대로 수행되지 않았음을 알 수 있다.) 다만 UX 측면에서 생각해보면 입력을 무시하는 것은 좋지 않다는 피드백을 들었다. 그것보다는 그냥 잘못된 구성이라는 점만 안내하는 것이 나을 것이라는 얘기였다. 옳으신 말씀이지만, 일단 구현해놨으니 놔두고 다음부터는 조언대로 따를 생각이다.

그리고 고민이었던 도메인 직접 입력 UI도 만들고 관련 기능 구현, 회원가입 시 로그인창으로 로컬@도메인을 합쳐서 전달하는 기능까지 만들었다. 또한 같은 기능을 하는 onFocusChangeListener는 리스터 객체를 하나 만들고 함께 사용하도록 모았다.

그리고 마지막으로 입력 무시 관련하여 피드백을 확실히 주도록 AlphaAnimation을 적용했다.

AlphaAnimation

텍스트뷰가 깜빡이도록 만들고 싶었다. 애니메이션을 모르는 상태로 했던 생각은, 코루틴을 만들고 점멸하는 시간만큼 runBlocking을 하면서 visible/invisible을 바꿔줘야 하겠다고 생각했다. 하지만 분명 좋은 기능이 있으리라고 생각하고 구글링을 해보니 역시 있었다.

// 액티비티에 애니메이션 객체를 만든다.
private val anim = AlphaAnimation(0.125f, 0.625f).apply {a
    duration = 100L
    repeatCount = 3
}

// 와쳐 등 필요한 곳에서 애니메이션을 실행.
tvPwWarn.startAnimation(anim)

원래는 애니메이션 변수만 선언하는 느낌으로 만들고 offset, duration 등은 클래스 바탕?에서 변경이 안되길래 onCreate에서 해줬는데, 이 글을 작성하면서 문득 apply가 생각나 적용해주었다. 두 군데로 파편화되어있던 코드를 모아줘서 기분이 좋다.
아무튼 이 애니메이션은 불투명도 0.125f, 0.625f를 지속시간이 100밀리초로 3번 반복하는 애니메이션이다. 끝나면 불투명도는 1로 돌아간다. (구글링한 예제에는 startOffset도 설정하던데, 큰 값을 주니까 빠르게 계속해서 실행하는 형태로 나타난다. 어떤 기능인지는 아직 모르겠다.)
간단한 기능이지만 만들어놓고 보니 만족감이 상당하다 ㅋㅋ..

0개의 댓글