졸업 작품 앱을 만들던 중 뷰를 클릭했을 때 반투명 효과를 적용하고 싶었다.
단, 클릭 가능한 모든 뷰에 자동으로 적용하고 싶었다. 일일이 xml에서 지정해주는게 아닌 자동으로 할 방법이 없을까를 생각하다가 이 글을 작성하게 되었다.
해당 글에선 TouchListener를 Override 하여 모든 뷰에 클릭 효과를 넣는 방법을 소개한다.
TransparentTouchListener.kt 생성
뷰를 클릭했을 때 반투명 효과를 주기 위해 아래와 같이 OnTouchListener를 재정의한다.
class TransparentTouchListener(
private val onTouchChanged: ((View, MotionEvent) -> Unit)? = null
) : View.OnTouchListener {
override fun onTouch(view: View, motionEvent: MotionEvent): Boolean {
if (view.isClickable) {
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
view.alpha = 0.5f // 50% 투명도로 설정
}
MotionEvent.ACTION_UP,
MotionEvent.ACTION_CANCEL,
MotionEvent.ACTION_OUTSIDE -> {
view.alpha = 1.0f // 100% 불투명도로 설정
}
}
}
onTouchChanged?.invoke(view, motionEvent)
return false
}
}
Fragment에 적용
👍해당 부분을 BaseFragment로 만들면 모든 Fragment에 손쉽게 적용할 수 있다.👍
applyTouchEffectToAllViews 메소드 생성
viewGroup을 순회하며 클릭 가능한 뷰(clickable = true)에 TouchListener를 적용한다.
private fun applyTouchEffectToAllViews(viewGroup: ViewGroup) {
for (i in 0 until viewGroup.childCount) {
val child = viewGroup.getChildAt(i)
if (child.isClickable) {
child.setOnTouchListener(TransparentTouchListener())
}
if (child is ViewGroup) {
applyTouchEffectToAllViews(child)
}
}
}
Fragment의 onViewCreated에서 해당 메소드를 호출한다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
applyTouchEffectToAllViews(view as ViewGroup)
}
RecyclerView에 적용
❗RecyclerView 내의 뷰에는 위의 방법으로 적용되지 않는다.❗
RecyclerView 내의 View들은 ViewHolder에서 바인딩이 진행 되기 때문에 ViewHolder에서 위의 리스너를 적용 해줘야한다.
ViewHolder
class MagazineObjectViewHolder(
private val bind: TimelineMagazineViewBinding
): TimeLineViewHolder(bind){
@SuppressLint("ClickableViewAccessibility")
override fun bind(item: TimeLineItem, isLastView: Boolean) {
/* 생략 */
// 터치 효과 적용
bind.magazineLayout.setOnTouchListener(TransparentTouchListener())
}
}
실행 결과
클릭하는 모든 뷰에 반투명 효과가 적용되는 것을 볼 수 있다.
반투명 효과를 적용할 수 있는 것도 그렇지만, 모든 뷰에 일일이 클릭 효과를 처리해주지 않아도 돼서 편리한 것 같다.
'안드로이드 > 이론' 카테고리의 다른 글
[ 안드로이드 ] WebView 페이지 탐색 처리 (0) | 2023.07.06 |
---|---|
[ 안드로이드 ] WebView 기본 사용법 (0) | 2023.07.06 |
[ 안드로이드 ] Retrofit2를 이용하여 서버와 통신하기 (2) - 예시 (0) | 2023.05.04 |
[ 안드로이드 ] Retrofit2를 이용하여 서버와 통신하기 (1) - 안전하게 통신하기 (SafeApiCall) (0) | 2023.05.04 |
[ 안드로이드 ] Room DB - Dao 사용법 (0) | 2023.04.08 |