-
움직이는 TextView개발/안드로이드 2021. 5. 11. 19:57
종종 화면내에서 움직이는 TextView를 만들어야 할 때가 있다.
이렇게 직선형태로 움직이는 애니메이션의 경우 TranslateAnimation 클래스를 이용해서 쉽게 구현이 가능하다. 아래 코드는 새로운 TextView를 만들고 layout에 추가한 다음 애니메이션을 실행한 코드다. 주목할 부분은 TranslateAnimation 코드다.
CoroutineScope(Dispatchers.Main).launch { val movingText = TextView(requireContext()).apply { this.text = "움직이는 텍스트" this.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply {} this.visibility = View.INVISIBLE this.setTextColor(0xff141414.toInt()) } danmu_layout.addView(movingText) movingText.post { val animation = TranslateAnimation(requireView().width.toFloat(), -(movingText.width.toFloat()), 0f, 0f) animation.duration = 3000 animation.repeatCount = Animation.INFINITE animation.setAnimationListener(object: Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) { movingText.visibility = View.VISIBLE } override fun onAnimationEnd(animation: Animation?) {} override fun onAnimationRepeat(animation: Animation?) {} }) movingText.startAnimation(animation) } }
TranslateAnimation 생성자 인자에서 받는 값은 fromXDelta, toXDelta, fromYDelta, toYDelta다. xml 파일로 애니메이션을 작성할 때는 퍼센테이지 값을 넣을 수 있는데, TranslateAnimation 클래스를 사용하면 픽셀 값으로 입력해야한다. 각각이 의미하는 바를 보자.
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
fromXDelta는 현재 위치로부터 Delta만큼 x축 방향으로 이동한 지점에서 애니메이션을 시작한다. 현재 위치부터 시작하고 싶다면 0을, 다른 위치로 변경하고 싶다면 특정 값을 설정하면 된다. + 값은 오른쪽으로 이동하고 - 값은 왼쪽으로 이동한다. 같은 원리로 toXDelta는 현 위치에서 x축 방향으로 이동한 지점에서 애니메이션을 종료한다. 왼쪽으로 이동한 지점에서 종료하고 싶다면 - 값을, 오른쪽으로 이동한 값에서 종료하고 싶으면 + 값을 넣으면 된다. 앞서 소개한 코드에선 fromXDelta에선 부모 뷰의 width만큼 움직여서 화면 밖에서 시작하고, toXDelta는 현재위치에서 텍스트의 width만큼 왼쪽으로 움직이므로 화면 밖으로 사라지는 애니메이션을 만들 수 있었다. 절대적인 좌표가 아니라 아니라 현 위치로부터 상대적인 거리로 값을 입력해야 한다는 점을 주의하자. y축에서도 동일한 원리를 적용할 수 있다.
'개발 > 안드로이드' 카테고리의 다른 글
Android 10 스토리지 정책 대처하기 (2) 2021.05.18 다음 페이지가 살짝 보이는 ViewPager2 만들기 (0) 2021.05.13 5월 5일부터는 앱의 광범위한 저장공간 액세스 권한이 필요한 이유를 알려야 합니다. (0) 2021.04.30 Thread, Runnable, Callable, ThreadPool (0) 2021.04.23 jitpack 이란 (0) 2021.03.28