Skip to content

Latest commit

 

History

History
343 lines (231 loc) · 8.39 KB

README.MD

File metadata and controls

343 lines (231 loc) · 8.39 KB

TimePicker

Description

TimePickerView는 시간 선택 UI를 위한 View입니다. 드래그를 이용해서 원하는 시간을 손쉽게 선택할 수 있습니다.

Features

  • drag를 이요한 선택 (보간법 적용)
  • Clock 종료 날자 조절 가능
  • 각도를 기준으로 계산
  • 호의 길이가 작은 영역은 터치 무효

SetUp

Add the JitPack repository in your build.gradle (top level module):

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

And add next dependencies in the build.gradle of the module:

dependencies {
    implementation 'com.github.heesung6701:TimePicker:0.0.1'
}

Screenshots

스크린샷 2020-03-02 오후 6 44 54

Use

1. xml 에 View 추가

<com.github.heesung6701.timepicker.library.TimePickerView
  android:id="@+id/time_picker"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
/>

속성 더 보기

2. 데이터 읽기/쓰기

선택된 시간의 정보는 TimePickerView의 timeItemArray에 저장되어 있다. timeItemArray 자세히 보기

time_picker.timeItemArray[0].selected = true

옵저버를 이용한 데이터 읽기

  1. Observer<Array> Interface 추가
...
class MainActivity : AppCompatActivity(), Observer<Array<TimeItem>>
...
override fun update(item: Array<TimeItem>) {
   // do something
}
  1. timeItemArray에 Observer를 추가한다.
time_picker.timeItemArray.add(this)

update 함수는 배열이 값이 변경되거나 벼열의 값인 Item의 속성이 변경되면 호출된다.

🔔 update 호출되는 경우 time_picker.timeItemArray[0].selected = true time_picker.timeItemArray[0] = TimeItem(false)

하지만 배열 자체가 변경되는 경우는 호출되지 않는다.

🔕 update 호출 안되는 경우 time_picker.timeItemArray = TimeItemArrayPublisher(24) { TimeItem.makeDefault() }

TimeItemArrayPublisher 자세히 보기

Attributes

clockSize

Clock의 크기를 지정한다.

app:clockSize="24"
name clockSize
Type Int
Default 24

clockSize: 24

FullImage

clockSize: 12

스크린샷 2020-03-02 오후 6 45 36

clockPadding

Clock 외부 여백을 지정한다.

app:clockPadding="50"
Name clockPadding
Type Float
Default 50.0f

clockPadding: 50.0f

Screenshot_1583143806

clockPadding: 0.0f

Screenshot_1583143543

timeTextColor

시간 텍스트 색상을 지정한다

app:timeTextColor
app:timeTextColor="#F6BB43"
Name timeTextColor
Type color
Default GRAY

Screenshot_1583144107

timeTextColor="#F6BB43"

Screenshot_1583144084

timeTextColor="#FFF700"

Screenshot_1583144186

timeSelectedTextColor

선택시 텍스트(시간) 색상을 지정한다

app:timeSelectedTextColor="#F6BB43"
Name timeSelectedTextColor
Type color
Default WHITE

Screenshot_1583144465

timeSelectedColor="#F6BB43"

Screenshot_1583144414

timeSelectedColor="#FF7F00"

Screenshot_1583144403

timeBackgroundColor

선택시 시간 배경 색상을 지정한다

app:timeBackgroundColor="#F6BB43"
Name timeBackgroundColor
Type color
Default GRAY

timeBackgroundColor = "#F6BB43"

Screenshot_1583144601

timeBackgroundColor = "#FF7F00"

Screenshot_1583144594

clockBorderColor

시계의 테두리 색상을 지정한다.

app:clockBorderColor="#F6BB43"
Name clockBorderColor
Type color
Default GRAY

clockBorderColor="#F6BB43"

Screenshot_1583144822

clockBorderColor="#FF7F00"

Screenshot_1583144842

clockColor

시계의 배경 색상을 지정한다.

app:clockColor="#F6BB43"
Name clockColor
Type color
Default WHITE

clockColor="#FF7F00"

Screenshot_1583144967

clockColor="#F6BB43"

Screenshot_1583144961

centerImage

시계 중앙의 이미지를 추가한다.

app:centerImage="@drawable/ic_search"
app:centerImageWidth="100dp"
app:centerImageHeight="100dp"
Name centerImage centerImageWidth centerImageHeight
Type reference dimension dimension
Default NONE 200.0f 200.0f

Screenshot_1583145551

centerImage="@drawable/ic_search" app:centerImageWidth="50dp" app:centerImageHeight="50dp" Screenshot_1583145541

app:centerImage="@drawable/ic_launcher_foreground" app:centerImageWidth="300dp" app:centerImageHeight="300dp" Screenshot_1583145615

Version Log

  • v0.0.1 기초적인 기능 구현 후 라이브러리 화 시도

Project Architecture

Project Structure

TimeItemArrayPublisher

TimeItemArrayPublisher는 Array을 가지고 있는 Publisher이다.

class TimeItemArrayPublisher(size: Int, init: (Int) -> TimeItem) : Publisher<Array<TimeItem>> {

private val array = Array<TimeItem>(size) { init(it) }
...

하지만 operator를 이용해서 배열과 같이 접근이 가능하다.

operator fun set(index: Int, element: TimeItem) {
    array[index] = element
    notifyObserver()
}

operator fun get(index: Int): TimeItem {
    return array[index]
}

여기서 주의할 점은 setter 함수를 호출하면 내부의 배열의 값을 바꾸면서 Observer에게 이 사실을 알린다.

class TimeItemArrayPublisher(...) : Publisher<Array<TimeItem>>, Observer<TimeItem>  {

TimeItemArrayPublisher는 배열의 요소인 TimeItem의 속성이 변경되는 것 또한 관측 하고 있다. 따라서 TimeItemArrayPublisher는 Array을 제공하는 Publisher이면서 TimeItem을 관측하는 Observer이다.

Calculation Process

  1. 입력된 좌표를 이용해서 Angle을 계산한다.
  2. 계산된 Angle을 sampling 해서 hour를 구한다.
  3. 이전 값을 이용해서 빠르게 드래그 할 경우 놓치게 되는 시간 값을 인식한다.
  4. 데이터를 업데이트 한다.

Plans

  • Time 범위 지정 가능
  • clock Border Stroke 설정 가능
  • ImageResource 설정
  • ImageDrawable 설정
  • time item을 layout으로 지정할 수 있도록 구현
  • Adapter 생성
  • Extends a CircularListView