Slide 1

Slide 1 text

ز٦ؙ،فٔד窩俑㶵׾ 㹋鄲׃׋鑧 DroidKaigi 2017 @futabooo

Slide 2

Slide 2 text

2 About me - Lead Engineer at eureka, Inc. - Java, Kotlin, Golang, TypeScript, AngularJS - FantasyEarth Zero, s.CRY.ed futabooo futabooo futabooo (ס׋ע٦)

Slide 3

Slide 3 text

3 About eureka https://eure.jp/

Slide 4

Slide 4 text

4 About eureka

Slide 5

Slide 5 text

5 About eureka • Web • Golang, Gin • TypeScript, AngularJS • Android • Java, Kotlin • Dagger2, Orma, OkHttp3, Retrofit2, RxKotlin, Picasso, ButterKnife, DataBinding • iOS • Objective-C, Swift • CoreStore, Alamofire, Moya RxSwift, AsyncDisplayKit • Web • PHP, Codeigniter • Android • Java • ActiveAndroid, Volley, OkHttp3, Retrofit2, Socket.IO, RxJava, Glide • iOS • Swift, Objective-C • CoreStore, AFNetworking, SwiftyJSON, SDWebImage, RxSwift, Cartography

Slide 6

Slide 6 text

ס׋׶ך䙼ְ⳿׾知⽃חⰟ剣 ،ٕغيծ鎸䙀傈ծأ؛آُ٦ٕ׾מהאחկ 06 About Couples ،ٕغي ٖؕٝت٦ 2" ز٦ؙ

Slide 7

Slide 7 text

ס׋׶ך䙼ְ⳿׾知⽃חⰟ剣 ،ٕغيծ鎸䙀傈ծأ؛آُ٦ٕ׾מהאחկ 07 About Couples ،ٕغي ٖؕٝت٦ 2" ز٦ؙ

Slide 8

Slide 8 text

08 About Couples ز٦ؙ ‣ ذؗأزًحإ٦آ ‣ 窩俑㶵 ‣ ن؎أًحإ٦آ ‣ 歗⫷ ‣ ⹛歗 ‣ أةٝف ‣ ⡘縧䞔㜠 ‣ 5IJOLJOHPG:PV

Slide 9

Slide 9 text

09 About Couples ز٦ؙ ‣ ذؗأزًحإ٦آ ‣ 窩俑㶵 ‣ ن؎أًحإ٦آ ‣ 歗⫷ ‣ ⹛歗 ‣ أةٝف ‣ ⡘縧䞔㜠 ‣ 5IJOLJOHPG:PV

Slide 10

Slide 10 text

،فٔ杝荈窩俑㶵㼪Ⰵ⵸ 10

Slide 11

Slide 11 text

11 Ӣ$PVQMFTפך׀䠐鋅٥׀䠬䟝 歗⫷ך鸐׶窩俑㶵ָ邌爙ׁ׸תׇ׿ 猘ָ鷏׏׋׮ךכ邌爙ׁ׸׷׫׋ְדׅ

Slide 12

Slide 12 text

Ӣ$PVQMFTפך׀䠐鋅٥׀䠬䟝 歗⫷ך鸐׶窩俑㶵ָ邌爙ׁ׸תׇ׿ 猘ָ鷏׏׋׮ךכ邌爙ׁ׸׷׫׋ְדׅ 12 畭劣װٍؗٔ،ך麩ְח״׏ג 姻׃ְ窩俑㶵ך邌爙ָדֹזְ

Slide 13

Slide 13 text

杝荈窩俑㶵ְ׸״ֲ 13

Slide 14

Slide 14 text

$PVQMFT杝荈窩俑㶵 㼪Ⰵתדך崧׸ 14

Slide 15

Slide 15 text

‣ ➬圫׾寸׭׷ ˖ ➭爡،فٔד杝荈窩俑㶵ָ㹋鄲ׁ׸גְ׷׮ ך׾灇瑔ׅ׷ ˖ 堣腉׾峤ְ⳿ׅ ˖ ؙؔٔذ؍ך然钠 ‣ Ꟛ涪ׅ׷ ˖ ➬圫寸׭ד峤ְ⳿׃׋堣腉ך㹋鄲 15 Couplesಠࣗֆจࣈಋೖ·ͰͷྲྀΕ

Slide 16

Slide 16 text

➭爡،فٔך灇瑔 16

Slide 17

Slide 17 text

‣ ➭爡،فٔד杝荈窩俑㶵ך֮׷،فٔ׾מ׋ׅ׵⢪ֲ ˖ -*/&ծ'BDFCPPL.FTTFOHFSծFUD ˖ غؚ׾鋅אֽ׷ּ׵ְך⹲ְד葿ղװ׷ 17 ଞࣾΞϓϦͷݚڀ

Slide 18

Slide 18 text

‣ ػೳͷચ͍ग़݁͠Ռ • ֆจࣈΛදࣔͰ͖Δ • ֆจࣈͷίϐʔ&ϖʔετ͕Ͱ͖Δ • ΞϓϦ֎ʹϖʔετ͢Δͱ୅ସςΩετͰ දࣔ͞ΕΔ • ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ 18 ଞࣾΞϓϦͷݚڀ

Slide 19

Slide 19 text

ַֿֿ׵Ꟛ涪ך鑧דׅ 19

Slide 20

Slide 20 text

窩俑㶵׾邌爙ׅ׷ 20

Slide 21

Slide 21 text

‣ Ⳣ椚ך崧׸ ˖ 邌爙ׅ׷俑㶵⴨ך⚥ַ׵窩俑㶵ח㼎䘔ׅ׷鿇ⴓ׾ 陎ⴽׅ׷ ˖ 邌爙ׅ׷俑㶵⴨ךוֿחו׿ז窩俑㶵׾邌爙ׅ׷ ַ׾⥂䭯ׅ׷ٔأز׾⡲䧭ׅ׷ ˖ 邌爙ׅ׷俑㶵⴨׾4QBOOBCMF4USJOHח׃ծٔأز ׾⯋ח㼎䘔ׅ׷鿇ⴓ׾窩俑㶵ה׃ג䲽歗ׅ׷ 21 ֆจࣈΛදࣔ͢Δ

Slide 22

Slide 22 text

‣ Ⳣ椚ך崧׸ 22 ֆจࣈΛදࣔ͢Δ こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int こんにちは 今日はいい天気ですね! SpannableString型 String型 SticonSpan sticon : Drawable altText : String DynamicDrawableSpan draw() ύʔαʔ

Slide 23

Slide 23 text

‣ ॲཧͷྲྀΕ 23 ֆจࣈΛදࣔ͢Δ こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int こんにちは 今日はいい天気ですね! SpannableString型 String型 SticonSpan sticon : Drawable altText : String DynamicDrawableSpan draw() ύʔαʔ

Slide 24

Slide 24 text

‣ ॲཧͷྲྀΕ 24 ֆจࣈΛදࣔ͢Δ TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int SticonSpan sticon : Drawable altText : String DynamicDrawableSpan draw() こんにちは 今日はいい天気ですね! SpannableString型 こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} String型 ύʔαʔ

Slide 25

Slide 25 text

‣ ॲཧͷྲྀΕ 25 ֆจࣈΛදࣔ͢Δ TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int SticonSpan sticon : Drawable altText : String DynamicDrawableSpan draw() こんにちは 今日はいい天気ですね! SpannableString型 こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} String型 ύʔαʔ

Slide 26

Slide 26 text

26 ֆจࣈΛදࣔ͢Δ // 表示したい文字列 String message = "こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}}";
 
 // どこにどの絵文字を表示するかを保持したリストを取得する
 List tokenList = TalkMessageHelper.getSticonSpanTokens(message); // リストを元に文字列に絵文字を対応させて描画する SpannableString spanedMessage = new SpannableString(message);
 for (TalkMessageToken t : tokenList) {
 spanedMessage .setSpan(t.characterStyle, t.beginIndex, t.endIndex, t.flags);
 }
 talkView.setText(spanedMessage); ‣ ॲཧͷྲྀΕ

Slide 27

Slide 27 text

27 ֆจࣈΛදࣔ͢Δ // 表示したい文字列 String message = "こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}}";
 
 // どこにどの絵文字を表示するかを保持したリストを取得する
 List tokenList = TalkMessageHelper.getSticonSpanTokens(message); // リストを元に文字列に絵文字を対応させて描画する SpannableString spanedMessage = new SpannableString(message);
 for (TalkMessageToken t : tokenList) {
 spanedMessage .setSpan(t.characterStyle, t.beginIndex, t.endIndex, t.flags);
 }
 talkView.setText(spanedMessage); ‣ ॲཧͷྲྀΕ

Slide 28

Slide 28 text

28 ֆจࣈΛදࣔ͢Δ // 表示したい文字列 String message = "こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}}";
 
 // どこにどの絵文字を表示するかを保持したリストを取得する
 List tokenList = TalkMessageHelper.getSticonSpanTokens(message); // リストを元に文字列に絵文字を対応させて描画する SpannableString spanedMessage = new SpannableString(message);
 for (TalkMessageToken t : tokenList) {
 spanedMessage .setSpan(t.characterStyle, t.beginIndex, t.endIndex, t.flags);
 }
 talkView.setText(spanedMessage); ‣ ॲཧͷྲྀΕ

Slide 29

Slide 29 text

29 ֆจࣈΛදࣔ͢Δ // 表示したい文字列 String message = "こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}}";
 
 // どこにどの絵文字を表示するかを保持したリストを取得する
 List tokenList = TalkMessageHelper.getSticonSpanTokens(message); // リストを元に文字列に絵文字を対応させて描画する SpannableString spanedMessage = new SpannableString(message);
 for (TalkMessageToken t : tokenList) {
 spanedMessage .setSpan(t.characterStyle, t.beginIndex, t.endIndex, t.flags);
 }
 talkView.setText(spanedMessage); ‣ ॲཧͷྲྀΕ

Slide 30

Slide 30 text

30 ֆจࣈΛදࣔ͢Δ // 表示したい文字列 String message = "こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}}";
 
 // どこにどの絵文字を表示するかを保持したリストを取得する
 List tokenList = TalkMessageHelper.getSticonSpanTokens(message); // リストを元に文字列に絵文字を対応させて描画する SpannableString spanedMessage = new SpannableString(message);
 for (TalkMessageToken t : tokenList) {
 spanedMessage .setSpan(t.characterStyle, t.beginIndex, t.endIndex, t.flags);
 }
 talkView.setText(spanedMessage); ‣ ॲཧͷྲྀΕ

Slide 31

Slide 31 text

31 ֆจࣈΛදࣔ͢Δ // 表示したい文字列 String message = "こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}}";
 
 // どこにどの絵文字を表示するかを保持したリストを取得する
 List tokenList = TalkMessageHelper.getSticonSpanTokens(message); // リストを元に文字列に絵文字を対応させて描画する SpannableString spanedMessage = new SpannableString(message);
 for (TalkMessageToken t : tokenList) {
 spanedMessage .setSpan(t.characterStyle, t.beginIndex, t.endIndex, t.flags);
 }
 talkView.setText(spanedMessage); ‣ ॲཧͷྲྀΕ

Slide 32

Slide 32 text

‣ {{ mustache }} • Logic-less templates • ୯७ͳஔ͖׵͑Λߦ͏ςϯϓϨʔτ • Java࣮૷ samskivert/jmustache 32 ֆจࣈΛදࣔ͢Δ String text = "One, two, {{three}}. Three sir!";
 Template tmpl = Mustache.compiler().compile(text);
 Map<> data = new HashMap();
 data.put("three", "five");
 System.out.println(tmpl.execute(data));
 //result: "One, two, five. Three sir!"

Slide 33

Slide 33 text

33 ֆจࣈΛදࣔ͢Δ String text = "One, two, {{three}}. Three sir!";
 Template tmpl = Mustache.compiler().compile(text);
 Map<> data = new HashMap();
 data.put("three", "five");
 System.out.println(tmpl.execute(data));
 //result: "One, two, five. Three sir!" ‣ {{ mustache }} • Logic-less templates • ୯७ͳஔ͖׵͑Λߦ͏ςϯϓϨʔτ • Java࣮૷ samskivert/jmustache

Slide 34

Slide 34 text

34 ֆจࣈΛදࣔ͢Δ String text = "One, two, {{three}}. Three sir!";
 Template tmpl = Mustache.compiler().compile(text);
 Map<> data = new HashMap();
 data.put("three", "five");
 System.out.println(tmpl.execute(data));
 //result: "One, two, five. Three sir!" ‣ {{ mustache }} • Logic-less templates • ୯७ͳஔ͖׵͑Λߦ͏ςϯϓϨʔτ • Java࣮૷ samskivert/jmustache

Slide 35

Slide 35 text

35 ֆจࣈΛදࣔ͢Δ String text = "One, two, {{three}}. Three sir!";
 Template tmpl = Mustache.compiler().compile(text);
 Map<> data = new HashMap();
 data.put("three", "five");
 System.out.println(tmpl.execute(data));
 //result: "One, two, five. Three sir!" ‣ {{ mustache }} • Logic-less templates • ୯७ͳஔ͖׵͑Λߦ͏ςϯϓϨʔτ • Java࣮૷ samskivert/jmustache

Slide 36

Slide 36 text

36 ֆจࣈΛදࣔ͢Δ String text = "One, two, {{three}}. Three sir!";
 Template tmpl = Mustache.compiler().compile(text);
 Map<> data = new HashMap();
 data.put("three", "five");
 System.out.println(tmpl.execute(data));
 //result: "One, two, five. Three sir!" ‣ {{ mustache }} • Logic-less templates • ୯७ͳஔ͖׵͑Λߦ͏ςϯϓϨʔτ • Java࣮૷ samskivert/jmustache

Slide 37

Slide 37 text

37 ֆจࣈΛදࣔ͢Δ String text = "One, two, {{three}}. Three sir!";
 Template tmpl = Mustache.compiler().compile(text);
 Map<> data = new HashMap();
 data.put("three", "five");
 System.out.println(tmpl.execute(data));
 //result: "One, two, five. Three sir!" ‣ {{ mustache }} • Logic-less templates • ୯७ͳஔ͖׵͑Λߦ͏ςϯϓϨʔτ • Java࣮૷ samskivert/jmustache

Slide 38

Slide 38 text

38 ֆจࣈΛදࣔ͢Δ ‣ samskivert/jmustache ˖ 俑㶵UP俑㶵ך縧ֹ䳔ִז׵ֿה駈׶׷ ˖ 窩俑㶵חׅ׷חכ穠㽷㹋鄲ָ䗳銲 ˖ ٓ؎ـٓٔכ⢪׻׆חծػ٦؟׾荈⵸ד㹋鄲

Slide 39

Slide 39 text

39 ֆจࣈΛදࣔ͢Δ ‣ ࣗલύʔαʔ • mustacheΛ࢖͍ͳ͕Βਖ਼نදݱͰΰϦΰϦ΍Δ • MatcherͱPatternΛ࢖͏ • {{sticon(1,10)}} → ରԠ͢Δֆจࣈ Λදࣔ͢ΔͨΊͷSpanΛ࡞੒͢Δ

Slide 40

Slide 40 text

40 ֆจࣈΛදࣔ͢Δ ‣ {{sticon(1,10)}} • sticon͸ֆจࣈͷ͜ͱ • sticon(άϧʔϓIDɺID)ɺID͸શͯͷsticonͰҰҙ • શͯͷsticonͰҰҙͳID͸ελϯϓͱͯ͠ૹΔ ࣌ʹ׆༂

Slide 41

Slide 41 text

41 ֆจࣈΛදࣔ͢Δ // 正規表現のパターンを作成する Pattern STICON = Pattern.compile("\\{\\{sticon\\(.+?\\)\\}\\}");
 Pattern IDS = Pattern.compile("(\\d+),(\\d+)"); List getSticonSpanTokens(String rawText) { ArrayList tokens = new ArrayList<>(); // Matcherを用いてパターンにマッチした部分へ処理を行う
 Matcher t = STICON.matcher(rawText);
 Matcher ids = IDS.matcher(""); while (t.find()) {// {{sticon(1,10)}}と{{sticon(2,20)}} matcherIds.reset(matcherTemplate.group());
 if (ids.find()) {// (1,10)と(2,20) TalkMessageToken token = new TalkMessageToken(sticonSpan, t.start(), t.end());
 tokens.add(token); } } } ‣ Ͳ͜ʹͲͷֆจࣈΛදࣔ͢Δ͔อ࣋ͨ͠Ϧετͷऔಘ

Slide 42

Slide 42 text

42 ֆจࣈΛදࣔ͢Δ // 正規表現のパターンを作成する Pattern STICON = Pattern.compile("\\{\\{sticon\\(.+?\\)\\}\\}");
 Pattern IDS = Pattern.compile("(\\d+),(\\d+)"); List getSticonSpanTokens(String rawText) { ArrayList tokens = new ArrayList<>(); // Matcherを用いてパターンにマッチした部分へ処理を行う
 Matcher t = STICON.matcher(rawText);
 Matcher ids = IDS.matcher(""); while (t.find()) {// {{sticon(1,10)}}と{{sticon(2,20)}} matcherIds.reset(t.group());
 if (ids.find()) {// (1,10)と(2,20) TalkMessageToken token = new TalkMessageToken(sticonSpan, t.start(), t.end());
 tokens.add(token); } } } ‣ Ͳ͜ʹͲͷֆจࣈΛදࣔ͢Δ͔อ࣋ͨ͠Ϧετͷऔಘ

Slide 43

Slide 43 text

43 ֆจࣈΛදࣔ͢Δ // 正規表現のパターンを作成する Pattern STICON = Pattern.compile("\\{\\{sticon\\(.+?\\)\\}\\}");
 Pattern IDS = Pattern.compile("(\\d+),(\\d+)"); List getSticonSpanTokens(String rawText) { ArrayList tokens = new ArrayList<>(); // Matcherを用いてパターンにマッチした部分へ処理を行う
 Matcher t = STICON.matcher(rawText);
 Matcher ids = IDS.matcher(""); while (t.find()) {// {{sticon(1,10)}}と{{sticon(2,20)}} matcherIds.reset(t.group())
 if (ids.find()) {// (1,10)と(2,20) TalkMessageToken token = new TalkMessageToken(sticonSpan, t.start(), t.end());
 tokens.add(token); } } } ‣ Ͳ͜ʹͲͷֆจࣈΛදࣔ͢Δ͔อ࣋ͨ͠Ϧετͷऔಘ

Slide 44

Slide 44 text

44 ֆจࣈΛදࣔ͢Δ // 正規表現のパターンを作成する Pattern STICON = Pattern.compile("\\{\\{sticon\\(.+?\\)\\}\\}");
 Pattern IDS = Pattern.compile("(\\d+),(\\d+)"); List getSticonSpanTokens(String rawText) { ArrayList tokens = new ArrayList<>(); // Matcherを用いてパターンにマッチした部分へ処理を行う
 Matcher t = STICON.matcher(rawText);
 Matcher ids = IDS.matcher(""); while (t.find()) {// {{sticon(1,10)}}と{{sticon(2,20)}}
 matcherIds.reset(t.group()); if (ids.find()) {// (1,10)と(2,20) TalkMessageToken token = new TalkMessageToken(sticonSpan, t.start(), t.end());
 tokens.add(token); } } } ‣ Ͳ͜ʹͲͷֆจࣈΛදࣔ͢Δ͔อ࣋ͨ͠Ϧετͷऔಘ

Slide 45

Slide 45 text

45 ֆจࣈΛදࣔ͢Δ // 正規表現のパターンを作成する Pattern STICON = Pattern.compile("\\{\\{sticon\\(.+?\\)\\}\\}");
 Pattern IDS = Pattern.compile("(\\d+),(\\d+)"); List getSticonSpanTokens(String rawText) { ArrayList tokens = new ArrayList<>(); // Matcherを用いてパターンにマッチした部分へ処理を行う
 Matcher t = STICON.matcher(rawText);
 Matcher ids = IDS.matcher(""); while (t.find()) {// {{sticon(1,10)}}と{{sticon(2,20)}} matcherIds.reset(t.group());
 if (ids.find()) {// (1,10)と(2,20) TalkMessageToken token = new TalkMessageToken(sticonSpan, t.start(), t.end());
 tokens.add(token); } } } ‣ Ͳ͜ʹͲͷֆจࣈΛදࣔ͢Δ͔อ࣋ͨ͠Ϧετͷऔಘ

Slide 46

Slide 46 text

46 ֆจࣈΛදࣔ͢Δ // 正規表現のパターンを作成する Pattern STICON = Pattern.compile("\\{\\{sticon\\(.+?\\)\\}\\}");
 Pattern IDS = Pattern.compile("(\\d+),(\\d+)"); List getSticonSpanTokens(String rawText) { ArrayList tokens = new ArrayList<>(); // Matcherを用いてパターンにマッチした部分へ処理を行う
 Matcher t = STICON.matcher(rawText);
 Matcher ids = IDS.matcher(""); while (t.find()) {// {{sticon(1,10)}}と{{sticon(2,20)}} matcherIds.reset(t.group());
 if (ids.find()) {// (1,10)と(2,20) TalkMessageToken token = new TalkMessageToken(sticonSpan, t.start(), t.end());
 tokens.add(token); } } } ‣ Ͳ͜ʹͲͷֆจࣈΛදࣔ͢Δ͔อ࣋ͨ͠Ϧετͷऔಘ

Slide 47

Slide 47 text

47 ֆจࣈΛදࣔ͢Δ class TalkMessageToken {
 public CharacterStyle characterStyle;
 public int beginIndex;
 public int endIndex; } ‣ TalkMessageToken • Ͳ͜ʹͲΜͳελΠϧΛ౰ͯΔ͔อ࣋͢ΔΫϥε こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} TalkMessageToken characterStyle = sticonSpan beginIndex = 5 endIndex = 20 TalkMessageToken characterStyle = sticonSpan beginIndex = 32 endIndex = 47

Slide 48

Slide 48 text

48 ֆจࣈΛදࣔ͢Δ ‣ TalkMessageToken • Ͳ͜ʹͲΜͳελΠϧΛ౰ͯΔ͔อ࣋͢ΔΫϥε こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} TalkMessageToken characterStyle = sticonSpan beginIndex = 5 endIndex = 20 TalkMessageToken characterStyle = sticonSpan beginIndex = 32 endIndex = 47 class TalkMessageToken {
 public CharacterStyle characterStyle;
 public int beginIndex;
 public int endIndex; }

Slide 49

Slide 49 text

49 ֆจࣈΛදࣔ͢Δ ‣ TalkMessageToken • Ͳ͜ʹͲΜͳελΠϧΛ౰ͯΔ͔อ࣋͢ΔΫϥε こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} TalkMessageToken characterStyle = sticonSpan beginIndex = 5 endIndex = 20 TalkMessageToken characterStyle = sticonSpan beginIndex = 32 endIndex = 47 class TalkMessageToken {
 public CharacterStyle characterStyle;
 public int beginIndex;
 public int endIndex; }

Slide 50

Slide 50 text

50 ֆจࣈΛදࣔ͢Δ ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } }

Slide 51

Slide 51 text

51 ֆจࣈΛදࣔ͢Δ class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } } ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε

Slide 52

Slide 52 text

52 ֆจࣈΛදࣔ͢Δ ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } }

Slide 53

Slide 53 text

53 ֆจࣈΛදࣔ͢Δ ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } }

Slide 54

Slide 54 text

54 ֆจࣈΛදࣔ͢Δ ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } }

Slide 55

Slide 55 text

55 ֆจࣈΛදࣔ͢Δ class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } } ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε

Slide 56

Slide 56 text

56 ֆจࣈΛදࣔ͢Δ ‣ SticonSpan • ֆจࣈ৘ใΛอ࣋͢ΔΫϥε class SticonSpan extends DynamicDrawableSpan { Drawable sticon;
 String altText;
 String rawText; int stickerId; 
 @Override
 public void draw(Canvas canvas, CharSequence text,
 int start, int end, float x,
 int top, int y, int bottom, Paint paint) { // 自身が適用されたstring部分をsticonに置換して描画する
 } }

Slide 57

Slide 57 text

こんにちは 今日はいい天気ですね! 57 ֆจࣈΛදࣔ͢Δ こんにちは{{sticon(1,10)}}今日はいい天気ですね!{{sticon(2,20)}} TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int TalkMessageToken characterStyle : SticonSpan beginIndex : int endIndex : int SpannableString型 String型 SticonSpan sticon : Drawable altText : String DynamicDrawableSpan draw() ύʔαʔ ‣ ͓͞Β͍

Slide 58

Slide 58 text

窩俑㶵׾ ؝ؾ٦ل٦أزדֹ׷ 58

Slide 59

Slide 59 text

‣ ॲཧͷྲྀΕ • ίϐʔ͞ΕͨΒԼهจࣈྻΛΞϓϦ಺Ͱอ࣋͢Δ • ੜςΩετ ʮ͜Μʹͪ͸{{sticon(1,10)}}ʯ • ୅ସςΩετ ʮ͜Μʹͪ͸(bo)ʯ • ୅ସςΩετΛΫϦοϓϘʔυʹอଘ͢Δ • Couples֎Ͱͷϖʔετ͸୅ସςΩετදࣔ • ίϐʔ࣌ͷจࣈྻͱൺ্ֱͨ͠Ͱϖʔετ͢Δ 59 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ

Slide 60

Slide 60 text

‣ ॲཧͷྲྀΕ 60 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ SpannableString型 こんにちは 今日はいい天気ですね! Copy copiedRawText: String copiedAltText : String sticonCopied: boolean ΞϓϦ಺ ΫϦοϓϘʔυ copiedAltText : String Paste こんにちは 今日はいい天気ですね! こんにちは(bo)今日はいい天気ですね!(Sunny)

Slide 61

Slide 61 text

‣ ॲཧͷྲྀΕ 61 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ SpannableString型 こんにちは 今日はいい天気ですね! Copy copiedRawText: String copiedAltText : String sticonCopied: boolean ΞϓϦ಺ ΫϦοϓϘʔυ copiedAltText : String Paste こんにちは 今日はいい天気ですね! こんにちは(bo)今日はいい天気ですね!(Sunny)

Slide 62

Slide 62 text

‣ ॲཧͷྲྀΕ 62 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ SpannableString型 こんにちは 今日はいい天気ですね! Copy copiedRawText: String copiedAltText : String sticonCopied: boolean ΞϓϦ಺ ΫϦοϓϘʔυ copiedAltText : String Paste こんにちは 今日はいい天気ですね! こんにちは(bo)今日はいい天気ですね!(Sunny)

Slide 63

Slide 63 text

‣ ॲཧͷྲྀΕ 63 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ SpannableString型 こんにちは 今日はいい天気ですね! Copy copiedRawText: String copiedAltText : String sticonCopied: boolean ΞϓϦ಺ ΫϦοϓϘʔυ copiedAltText : String Paste こんにちは 今日はいい天気ですね! こんにちは(bo)今日はいい天気ですね!(Sunny)

Slide 64

Slide 64 text

64 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ ‣ ॲཧͷྲྀΕ // 文字列をアプリ内に保持する setCopiedText(message); // クリップボードに代替テキストを保存 altText = TalkMessageHelper.getAltText(message);
 String[] mimetype = {ClipDescription.MIMETYPE_TEXT_PLAIN};
 ClipData.Item item = new ClipData.Item(altText);
 ClipData cd = new ClipData(new ClipDescription("text",mimetype),item);
 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 cm.setPrimaryClip(cd); // コピー時の文字列と比較した上で貼り付け @Override public void afterTextChanged(Editable s) { if (isSticonPasted()) { // 絵文字表示処理 } }

Slide 65

Slide 65 text

65 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ ‣ ॲཧͷྲྀΕ // 文字列をアプリ内に保持する setCopiedText(message); // クリップボードに代替テキストを保存 altText = TalkMessageHelper.getAltText(message);
 String[] mimetype = {ClipDescription.MIMETYPE_TEXT_PLAIN};
 ClipData.Item item = new ClipData.Item(altText);
 ClipData cd = new ClipData(new ClipDescription("text",mimetype),item);
 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 cm.setPrimaryClip(cd); // コピー時の文字列と比較した上で貼り付け @Override public void afterTextChanged(Editable s) { if (isSticonPasted()) { // 絵文字表示処理 } }

Slide 66

Slide 66 text

66 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ ‣ ॲཧͷྲྀΕ // 文字列をアプリ内に保持する setCopiedText(message); // クリップボードに代替テキストを保存 altText = TalkMessageHelper.getAltText(message);
 String[] mimetype = {ClipDescription.MIMETYPE_TEXT_PLAIN};
 ClipData.Item item = new ClipData.Item(altText);
 ClipData cd = new ClipData(new ClipDescription("text",mimetype),item);
 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 cm.setPrimaryClip(cd); // コピー時の文字列と比較した上で貼り付け @Override public void afterTextChanged(Editable s) { if (isSticonPasted()) { // 絵文字表示処理 } }

Slide 67

Slide 67 text

67 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ ‣ ॲཧͷྲྀΕ // 文字列をアプリ内に保持する setCopiedText(message); // クリップボードに代替テキストを保存 altText = TalkMessageHelper.getAltText(message);
 String[] mimetype = {ClipDescription.MIMETYPE_TEXT_PLAIN};
 ClipData.Item item = new ClipData.Item(altText);
 ClipData cd = new ClipData(new ClipDescription("text",mimetype),item);
 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 cm.setPrimaryClip(cd); // コピー時の文字列と比較した上で貼り付け @Override public void afterTextChanged(Editable s) { if (isSticonPasted()) { // 絵文字表示処理 } }

Slide 68

Slide 68 text

68 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ ‣ ॲཧͷྲྀΕ // 文字列をアプリ内に保持する setCopiedText(message); // クリップボードに代替テキストを保存 altText = TalkMessageHelper.getAltText(message);
 String[] mimetype = {ClipDescription.MIMETYPE_TEXT_PLAIN};
 ClipData.Item item = new ClipData.Item(altText);
 ClipData cd = new ClipData(new ClipDescription("text",mimetype),item);
 ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 cm.setPrimaryClip(cd); // コピー時の文字列と比較した上で貼り付け @Override public void afterTextChanged(Editable s) { if (isSticonPasted()) { // 絵文字表示処理 } }

Slide 69

Slide 69 text

‣ ͓͞Β͍ 69 ֆจࣈΛίϐʔ&ϖʔετͰ͖Δ SpannableString型 こんにちは 今日はいい天気ですね! Copy copiedRawText: String copiedAltText : String sticonCopied: boolean ΞϓϦ಺ ΫϦοϓϘʔυ copiedAltText : String Paste こんにちは 今日はいい天気ですね! こんにちは(bo)今日はいい天気ですね!(Sunny)

Slide 70

Slide 70 text

窩俑㶵⦐׌ֽד鷏׷ה أةٝفחז׷ 70

Slide 71

Slide 71 text

‣ ॲཧͷྲྀΕ • ϝοηʔδૹ৴ͷλΠϛϯάͰֆจࣈ1ݸ͚͔ͩ Ͳ͏͔Λ൑ఆ͢Δ • ֆจࣈ1ݸ͚ͩͷ৔߹ɺελϯϓͱͯ͠ૹ৴͢Δ 71 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ

Slide 72

Slide 72 text

‣ ελϯϓͱͯ͠ૹΔ͔Ͳ͏͔൑ఆ͢Δ 72 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ public boolean isSendSticonAsSticker(){
 SticonSpan[] tokens =editText.getText().getSpans( 0, editText.getText().length(), SticonSpan.class); if(tokens.length == 1){ // 絵文字を表す文字列が1個だけ入力されてる場合
 if(tokens[0].getTemplateString().equals(editText.getText())){
 return true;
 }
 } // 絵文字が1個だけじゃない場合
 return false;
 }

Slide 73

Slide 73 text

‣ ελϯϓͱͯ͠ૹΔ͔Ͳ͏͔൑ఆ͢Δ 73 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ public boolean isSendSticonAsSticker(){
 SticonSpan[] tokens =editText.getText().getSpans( 0, editText.getText().length(), SticonSpan.class); if(tokens.length == 1){ // 絵文字を表す文字列が1個だけ入力されてる場合
 if(tokens[0].getTemplateString().equals(editText.getText())){
 return true;
 }
 } // 絵文字が1個だけじゃない場合
 return false;
 }

Slide 74

Slide 74 text

‣ ελϯϓͱͯ͠ૹΔ͔Ͳ͏͔൑ఆ͢Δ 74 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ public boolean isSendSticonAsSticker(){
 SticonSpan[] tokens =editText.getText().getSpans( 0, editText.getText().length(), SticonSpan.class); if(tokens.length == 1){ // 絵文字を表す文字列が1個だけ入力されてる場合
 if(tokens[0].getTemplateString().equals(editText.getText())){
 return true;
 }
 } // 絵文字が1個だけじゃない場合
 return false;
 }

Slide 75

Slide 75 text

‣ ελϯϓͱͯ͠ૹΔ͔Ͳ͏͔൑ఆ͢Δ 75 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ public boolean isSendSticonAsSticker(){
 SticonSpan[] tokens =editText.getText().getSpans( 0, editText.getText().length(), SticonSpan.class); if(tokens.length == 1){ // 絵文字を表す文字列が1個だけ入力されてる場合
 if(tokens[0].getTemplateString().equals(editText.getText())){
 return true;
 }
 } // 絵文字が1個だけじゃない場合
 return false;
 }

Slide 76

Slide 76 text

‣ ελϯϓͱͯ͠ૹΔ͔Ͳ͏͔൑ఆ͢Δ 76 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ public boolean isSendSticonAsSticker(){
 SticonSpan[] tokens =editText.getText().getSpans( 0, editText.getText().length(), SticonSpan.class); if(tokens.length == 1){ // 絵文字を表す文字列が1個だけ入力されてる場合
 if(tokens[0].getTemplateString().equals(editText.getText())){
 return true;
 }
 } // 絵文字が1個だけじゃない場合
 return false;
 }

Slide 77

Slide 77 text

‣ ελϯϓΛૹΔ 77 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ if (isSendSticonAsSticker()) { Editable t = editText.getText() SticonSpan[] spans = t.getSpans(0, t.length(), SticonSpan.class);
 // スタンプを生成して送信 Sticker sticker = new Sticker(spans[0].getSticonId());
 sendStamp(sticker); } else { // テキストメッセージ&絵文字として送信 }

Slide 78

Slide 78 text

‣ ελϯϓΛૹΔ 78 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ if (isSendSticonAsSticker()) { Editable t = editText.getText() SticonSpan[] spans = t.getSpans(0, t.length(), SticonSpan.class);
 // スタンプを生成して送信 Sticker sticker = new Sticker(spans[0].getSticonId());
 sendStamp(sticker); } else { // テキストメッセージ&絵文字として送信 }

Slide 79

Slide 79 text

‣ ελϯϓΛૹΔ 79 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ if (isSendSticonAsSticker()) { Editable t = editText.getText() SticonSpan[] spans = t.getSpans(0, t.length(), SticonSpan.class);
 // スタンプを生成して送信 Sticker sticker = new Sticker(spans[0].getSticonId());
 sendStamp(sticker); } else { // テキストメッセージ&絵文字として送信 }

Slide 80

Slide 80 text

‣ ελϯϓΛૹΔ 80 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ if (isSendSticonAsSticker()) { Editable t = editText.getText() SticonSpan[] spans = t.getSpans(0, t.length(), SticonSpan.class);
 // スタンプを生成して送信 Sticker sticker = new Sticker(spans[0].getSticonId());
 sendStamp(sticker); } else { // テキストメッセージ&絵文字として送信 }

Slide 81

Slide 81 text

‣ ͓͞Β͍ 81 ֆจࣈ1ݸ͚ͩͰૹΔͱελϯϓʹͳΔ

Slide 82

Slide 82 text

عو׏׋הֿ׹ 82

Slide 83

Slide 83 text

‣ 㣐ꆀך窩俑㶵׾邌爙ׅ׷הأؙٗ٦ָؙٕؕאֻ ‣ 窩俑㶵ך؝ؾل׾ׅ׷ה俑㶵ָⴖ׸׷ 83 ϋϚͬͨͱ͜Ζ

Slide 84

Slide 84 text

‣ 㣐ꆀך窩俑㶵׾邌爙ׅ׷הأؙٗ٦ָؙٕؕאֻ ‣ 窩俑㶵ך؝ؾل׾ׅ׷ה俑㶵ָⴖ׸׷ 84 ϋϚͬͨͱ͜Ζ

Slide 85

Slide 85 text

‣ أؙٗ٦ٕךؙؕאֹכDBDIF㼪Ⰵד鍑寸 ˖ -SV$BDIF ˖ 俑㶵؟؎ؤחさ׻ׇג窩俑㶵ך؟؎ؤ׮㢌⻉ׅ ׷ךדծLFZח俑㶵؟؎ؤ׮Ⰵ׸׷ 85 େྔͷֆจࣈΛදࣔ͢ΔͱεΫϩʔϧ͕ΧΫͭ͘

Slide 86

Slide 86 text

‣ أؙٗ٦ٕךؙؕאֹכDBDIF㼪Ⰵד鍑寸 86 େྔͷֆจࣈΛදࣔ͢ΔͱεΫϩʔϧ͕ΧΫͭ͘ Before After

Slide 87

Slide 87 text

‣ 㣐ꆀך窩俑㶵׾邌爙ׅ׷הأؙٗ٦ָؙٕؕאֻ ‣ 窩俑㶵ך؝ؾل׾ׅ׷ה俑㶵ָⴖ׸׷ 87 ϋϚͬͨͱ͜Ζ

Slide 88

Slide 88 text

‣ ؝ؾلך眔㔲׾锃侭ׅ׷ٗآحؙ׾鷄⸇ׅ׷ 88 ֆจࣈͷίϐϖΛ͢Δͱจࣈ͕੾ΕΔ こんにちは 今日はいい天気ですね! Copy こんにちは{{sticon(1,10)}} ׉ךתת׌הNVTUBDIFך鷿⚥דⴖ׸׷ こんにちは{{sticon(1,10)}} ؝ؾلך眔㔲׾NVTUBDIFך穄畭ח⠼לׅ

Slide 89

Slide 89 text

‣ ؝ؾلך眔㔲׾锃侭ׅ׷ٗآحؙ׾鷄⸇ׅ׷ 89 ֆจࣈͷίϐϖΛ͢Δͱจࣈ͕੾ΕΔ こんにちは 今日はいい天気ですね! Copy こんにちは{{sticon(1,10)}} ׉ךתת׌הNVTUBDIFך鷿⚥דⴖ׸׷ こんにちは{{sticon(1,10)}} ؝ؾلך眔㔲׾NVTUBDIFך穄畭ח⠼לׅ

Slide 90

Slide 90 text

‣ ؝ؾلך眔㔲׾锃侭ׅ׷ٗآحؙ׾鷄⸇ׅ׷ 90 ֆจࣈͷίϐϖΛ͢Δͱจࣈ͕੾ΕΔ こんにちは 今日はいい天気ですね! Copy こんにちは{{sticon(1,10)}} ׉ךתת׌הNVTUBDIFך鷿⚥דⴖ׸׷ こんにちは{{sticon(1,10)}} ؝ؾلך眔㔲׾NVTUBDIFך穄畭ח⠼לׅ

Slide 91

Slide 91 text

‣ ؝ؾلך眔㔲׾锃侭ׅ׷ٗآحؙ׾鷄⸇ׅ׷ 91 ֆจࣈͷίϐϖΛ͢Δͱจࣈ͕੾ΕΔ こんにちは 今日はいい天気ですね! Copy こんにちは{{sticon(1,10)}} ׉ךתת׌הNVTUBDIFך鷿⚥דⴖ׸׷ こんにちは{{sticon(1,10)}} ؝ؾلך眔㔲׾NVTUBDIFך穄畭ח⠼לׅ

Slide 92

Slide 92 text

תה׭ 92

Slide 93

Slide 93 text

‣ 㹋鄲ך倯岀ָⴓַ׵זְ儗כ⿫罋חדֹ׷،فٔ׾ 䱱׃ג⹛⡲׾锃ץ׷ ‣ 窩俑㶵ך邌爙חכ4QBOOBCMF4USJOHה䭁䓸׃׋ 4QBOؙٓأ׾⢪ֲ ‣ 邌爙♳窩俑㶵ח鋅ִ׷׌ֽדUFYUכ俑㶵⴨ָⰅ׏ג ְ׷ךדծ؝ؾلזו&EJU5FYUװ5FYU7JFXפךⳢ椚 כ岣䠐ׅ׷ 93 ·ͱΊ

Slide 94

Slide 94 text

Thank you Credit: NASA Earth Observatory/NOAA NGDC