본문 바로가기

전체 글129

[Android] parent의 영역을 벗어나서 UI를 그려보자 - clipChildren 안드로이드에서는 기본적으로 View를 그릴 때 그릴 수 있는 영역이 제한되어 있다. 보통 parent가 가진 영역만큼 View를 그릴 수 있다. 하지만 개발하다 보면 parent의 영역을 벗어나게끔 그리고 싶을 때가 생긴다. 이럴 때 clipChildren 옵션을 사용하면 가능해진다. 예시를 통해 알아보자. 위와 같은 화면이 있다고 해보자. 검은색 레이아웃 안에 빨간색 View가 있는 상태이다. 검은색 레이아웃을 벗어나기 위해 marginTop 옵션을 줘서 밑으로 내린 상태다. 위의 레이아웃 아래와 같다. 검은색의 레이아웃은 전체 길이가 300dp로 주었고, 빨간색의 VIew는 marginTop을 250dp를 주었다. 따라서 50dp 정도를 검은색 레이아웃을 벗어나서 그려지길 원했다. 하지만 위의 사진처.. 2020. 12. 6.
[Android] Custom Calendar 만들기 - Infinite ViewPager 구현 지난 프로젝트에서 Calendar를 만들게 되었는데, 만드는 과정에서 까다로웠던 부분이 있어서 블로그에 공유하려고 한다. 월간 달력 부분을 만들어야 했고, 처음에는 간단하게 생각했다. 월간 달력은 그리드 형태기 때문에 GridView나 RecyclerView를 사용하려 했고, 좌우로 스와이프가 되어야 했기에 ViewPager2를 사용하여 구현하면 금방 할 줄 알았다. 하지만... 1. Infinite ViewPager 월간 달력은 좌우로 무제한으로 스와이프 되어야 한다는 조건이 있었다. 이걸 어떻게 구현해야 할까 고민하다가 찾아보니 스와이프 할 때마다 페이지를 추가, 삭제하면서 현재 position 값을 고정적으로 유지하는 방법이 있었다. 위의 사진과 같이 전체 item 개수를 3개로 고정한 뒤, 오른쪽.. 2020. 11. 27.
[Android] FlexboxLayout를 활용한 Chip EditText 만들기 이번 프로젝트를 하며 EditText 앞에 Chip이 추가되는 방식의 화면을 구현해야 했다. 기존의 방식은 ChipGroup과 EditText를 사용해서 입력을 하면 ChipGroup에 추가되는 방식이었지만, 마지막 Chip 바로 옆에 입력창이 있었으면 했다. 이러한 방식으로는 도저히 생각나지 않아 다른 방법을 찾아본 결과 FlexboxLayout를 활용한 방법을 알게 되었다. FlexboxLayout은 웹에서 사용되던 CSS Flexible Box Layout Module을 안드로이드에 접목하여 개발한 라이브러리이다. 구글에서 만든 라이브러리인데 왜 이제야 알았을까. 뷰를 동적으로 추가해야 한다고 했을 때 자연스러운 모션을 보여줘야 한다면 FlexboxLayout이 좋은 선택지가 될 수 있다. Flex.. 2020. 11. 19.
[Kotlin] inline에 대하여 - inline, noinline, crossinline, reified inline 키워드에 대해서는 처음 코틀린을 공부할 때 보긴 봤었지만, 정확히 어떤 상황에서 사용하는지 알지 못했었다. 이번에 코틀린 확장 함수를 정리하다가 inline 키워드에 대하여 자세히 알게 되었고, 관련 내용을 기술하려고 한다. inline 키워드를 한마디로 설명한다면 다음과 같다. 고차 함수를 사용하면 런타임 패널티가 있기 때문에 함수 구현 자체를 코드에 넣음으로써 오버헤드를 없앨 수 있다. 이게 대체 무슨 말일까? 예시를 통해 좀 더 쉽게 알아보자. inline fun doSomething(action: () -> Unit) { action() } fun callFunc() { doSomething { println("문자열 출력!") } } 위와 같은 고차 함수가 있다고 하자. 이 코드를 .. 2020. 10. 11.
[Kotlin] Kotlin의 Delegates 알아보기 - observable, vetoable 디자인 패턴에서 Delegate Pattern이란 어떠한 기능을 자기 자신이 처리하지 않고 다른 객체에 일을 위임시켜 그 객체가 일을 처리하게끔 하는 것이다. Kotlin의 Delegates를 활용하면 여러 가지 일을 간단하게 처리할 수가 있다. 이 글에서는 Delegates의 observable과 vetoable를 활용하는 방법을 알아볼 것이다. observable과 vetoable을 사용하면 어떤 데이터의 값이 변경되었는지 쉽게 알아낼 수가 있다. 다시 말해, 옵저버 패턴을 쉽게 구현할 수가 있다. observable observable은 위에서 언급한 대로 프로퍼티를 observable 하게 만들어준다. 이것을 이용하면 프로퍼티의 데이터가 변할 때마다 callback을 받을 수 있다. public .. 2020. 10. 1.
[Android] CollapsingToolbarLayout 응용하기 - Google Calendar App 클론 코딩 이번 포스트에서는 CollapsingToolbarLayout을 응용하여 구글 캘린더 앱의 아래와 같은 효과를 따라 해 볼 것이다. 구현하고자 하는 기능은 위와 같이 월간 달력이 접히거나 펼치는 기능이 있고, 일간 화면을 스크롤하여 월간 달력을 접거나 펼칠 수 있다. 또한 월간 달력이 펼쳐진 상태에서는 일간 화면의 스크롤이 동작하지 않아야 하며, 접힌 상태에서는 동작이 되어야 한다. 전체적인 구조는 다음과 같다. AppBarLayout과 상호작용 하기 위한 NestedScrollView와 FrameLayout이 있다. FrameLayout 안의 Fragment에서 일간 화면을 그려준다. NestedScrollView와 FrameLayout 둘 다 AppBarLayout 접히거나 펼쳐지면 함께 움직여야 하기.. 2020. 9. 19.