Slide 1

Slide 1 text

Spannable芸 〜郵便番号編〜 potatotips #49 株式会社ノハナ 瀬戸優之 @seto_hi

Slide 2

Slide 2 text

自己紹介 ● 瀬戸優之 Seto HiroYUKI @seto_hi ● Androidエンジニア & アプリデザイン ● 株式会社ノハナ ○ 一組でも多くの家族に笑顔を届ける ○ 絶賛採用中 ● Material Design大好き ● 好きなAPIはCanvas#saveとViewGroup#layout

Slide 3

Slide 3 text

最高の 郵便番号入力欄を 作りたい

Slide 4

Slide 4 text

最高の郵便番号入力欄 要件 ● 3桁目と4桁目の間にハイフンを表示したい ● 3桁目を打ったらハイフンの後にカーソルが移動 ○ ハイフンは入力させたくない ○ アプリ側で入力したくもない ○ inputType=numberでやりたい ● 上3桁と下4桁をシームレスに移動したい ○ カーソル、文字削除、ペースト

Slide 5

Slide 5 text

郵便番号入力欄問題 ● EditText2つ ○ 2つのEditText間のカーソル移動問題 ○ 削除、ペースト問題 ● EditText1つ ○ ハイフンが表示できない ○ or ハイフンが文字として入力される ● 恐らくクレカ番号入力欄でも同じ課題がある

Slide 6

Slide 6 text

簡単!写真1枚で 子どもの成長を届ける カレンダー付き ポストカードアプリ

Slide 7

Slide 7 text

Spannableで解決

Slide 8

Slide 8 text

Spannable ● 文字列のデコレーションのinterface ● SpannableStringBuilderなどが対応 ● 文字(列)に対してSpanを設定する ○ URLSpan, StyleSpan, TypefaceSpan, etc.. ● 未確定文字列の色や下線もSpan

Slide 9

Slide 9 text

ReplacementSpan

Slide 10

Slide 10 text

ReplacementSpan ● TextViewの文字列を置換するSpan ● 独自絵文字やデコ絵文字などに使われている ● 文字列の描画幅を任意に変更できる ● 文字列と描画を異なるものにできる

Slide 11

Slide 11 text

実装

Slide 12

Slide 12 text

サンプル https://github.com/hiroyuki-seto/PostalCodeSample

Slide 13

Slide 13 text

カスタムEditText+カスタムSpan ● EditText ○ 3文字目にカスタムSpanを設定 ○ onDrawでハイフンを描画 ● Span ○ ReplacementSpanを継承 ○ getSizeで対象の文字の幅+ハイフンの幅を返す ○ drawで対象の文字を描画

Slide 14

Slide 14 text

Slide 15

Slide 15 text

罠 ● 0文字の際はReplacementSpanが効かない →仕様 ● 未確定文字列の背景の描画 →サンプル見てね! ● SurrogatePairを考慮したSpan →気合  かなり地道に実装する必要がある

Slide 16

Slide 16 text

Have a nice Spannable!