original source : https://youtu.be/I5ztEeRHFMc












이 강의는 custom view에서 어떻게 scroll을 내부적으로 처리하는지를 설명하고 있다.
ScrollBar를 보이기 위해서는 view의 android:scrollbars에 vertical 또는 horizontal을 입력한다.
아래 코드를 설명하면
GestureDetector를 이용해서 사용자의 scroll을 감지하면 onScroll()이 호출된다. scrollBy()를 통해 특정 이동만큼 view을 이동하고 invalidate()를 통해 다시 그린다.
=========================================================
.
.
=========================================================
.
.
위와 같이 매번 scrollbars 항목을 지정하기 귀찮다면 아래와 같이 theme으로 지정하여 사용할수도 있다.
=========================================================
.
.
아래그림은 EdgeEffect의 예시를 보여주고 있다.
=========================================================
.
.
=========================================================
.
.
ClipData는 안드로이드에서 다른 앱에 ClipBoard나 drag and drop을 통해 전달될 정보를 가지는 class이다.
Drawable obj는 내부에 getIntrinsicHeight(), getIntrinsicWidth() 함수들을 구현해서 외부에서 이 함수를 호출했을때 Drawable이 실제 그려지는 부분의 크기를 되돌린다.
Drawable obj는 내부에 setLevel(), setState() 함수들을 구현해서 각 level, state에 맞게 drawable obj가 행동하도록 만든다.
Drawable.Callback interface는 invalidateDrawable(),
scheduleDrawable(),
unscheduleDrawable()들을 구현해야 한다.
참조) https://developer.android.com/reference/android/graphics/drawable/Drawable.Callback
=========================================================
.
.
아래는 custom view내부에서 drawable을 사용하는 경우를 보여주고 있다
=========================================================
.
.
Drawable 자체를 만드는 과정
=========================================================
.
.
개발자가 새로운 Layout을 만들고 그 안에서 새로누 LayoutParams를 만들어 사용하는 경우 Layout class 안에 generatedLayouParams(), generateDefaultLayoutParams(), checkLayoutParams()를 구현해 주어야 한다.
이 강의에서 예제 코드는 image 와 text를 같이 보여주는 compound view를 구현한다.
merge를 통해 설정하지 못한 속성을 아래와 같이 해서 구현한다.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
CENTER_CROP을 가장 많이 사용하며 최초이미지가 크면 가운데를 기준으로 꽉찬 상태를 유지하며 줄인거나 꽉찬 상태를 유지하며 늘린다.
CENTER_INSIDE 최초이미지가 크면 가운데를 기준으로 줄이면서
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
imeOptions은 singleLine이 true인 경우에만 적용된다.
=========================================================
.
.
activity안에 있는 EditText를 선택한 경우 나오는 soft keyboard에 대한 설정을 보여주고 있다.
=========================================================
.
.
=========================================================
.
.
soft keyboard가 등장함으로써 주어야하는 layout의 변경을 기본적으로 AndroidManifest의 window soft input mode 설정을 통해 구현할수 있다.
=========================================================
.
.
nextFocusDown에서 다음 포커스가 이동할 view의 아이디를 생성 설정한다. @+id를 주의 해서 볼것.
=========================================================
.
.
=========================================================
.
.
실시간 사용자 입력값을 얻기위해서는 EditText의 getText()를 이용하지 않고 TextWatcher를 사용한다.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
아래는 ratingbar 이미지 교체에 대한 설명이다. <layer-list>로 만든 drawable과 이를 사용하고 있는 <selector>에 주의해서 볼것
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.
=========================================================
.
.