Slide 1

Slide 1 text

4VQQPSU-JCSBSZך %PXOMPBEBCMF'POUTװ&NPKJ$PNQBU ח㼎䘔׃׋،فٔ׾⡲׹ֲ %SPJE,BJHJ UBLBIJSPN

Slide 2

Slide 2 text

˖ UBLBIJSPN !OFX@SVOOBCMF ˖ 劤せכ嬁「䃨峔 ׭׿ׄױ׋ַמ׹ ˖ "OESPJEָ㥨ֹ ˖ "CFNB57ך"OESPJE،فٔ׾⡲׏גְתׅկ ˖ %SPJE,BJHJⰕ䒭،فٔךٔ٦ت٦׾׃ת׃׋
 ⟃♳ךفؙٕٔؒأز֮׶ָהֲ׀ְׂת׃׋!
 ؎ٝأز٦ٕ׃גזַ׏׋׵؎ٝأز٦ٕ׃גֻ׌ְׁ 荈ⴓחאְג

Slide 3

Slide 3 text

˖ %PXOMPBEBCMF'POU ˖ %PXOMPBEBCMF'POUך稱➜ ˖ 'POU3FTPVSDFך稱➜ ˖ %PXOMPBEBCMF'POU׾⢪׏ג׫״ֲ ˖ %PXOMPBEBCMF'POUך➬穈׫ ˖ וֲװ׏ג%PXOMPBEBCMF'POU׾⢪׏גְַֻ ˖ &NPKJ$PNQBU ˖ &NPKJ$PNQBUך稱➜ ˖ &NPKJ$PNQBUך➬穈׫ ˖ וֲװ׏ג&NPKJ$PNQBU׾⢪׏גְַֻ ˖ ذأز倯岀 ˖ תה׭ 湡如

Slide 4

Slide 4 text

%PXOMPBEBCMF'POU

Slide 5

Slide 5 text

%PXOMPBEBCMF'POUהכ

Slide 6

Slide 6 text

˖ ؿؓٝز׾《䖤ׅ׷➬穈׫ %PXOMPBEBCMF'POUהכ

Slide 7

Slide 7 text

˖ ؿؓٝز׾《䖤ׅ׷➬穈׫ ˖ (PPHMF*0ך8IBUˏT/FX*O"OESPJEד涪邌 %PXOMPBEBCMF'POUהכ

Slide 8

Slide 8 text

˖ ؿؓٝز׾《䖤ׅ׷➬穈׫ ˖ (PPHMF*0ך8IBUˏT/FX*O"OESPJEד涪邌 ˖ "OESPJE "1*MFWFM ה4VQQPSU-JCSBSZדⵃ欽〳腉 %PXOMPBEBCMF'POUהכ

Slide 9

Slide 9 text

˖ ؿؓٝز׾《䖤ׅ׷➬穈׫ ˖ (PPHMF*0ך8IBUˏT/FX*O"OESPJEד涪邌 ˖ "OESPJE "1*MFWFM ה4VQQPSU-JCSBSZדⵃ欽〳腉 ˖ "OESPJE "1*MFWFM ⟃♳ד⹛⡲ %PXOMPBEBCMF'POUהכ

Slide 10

Slide 10 text

%PXOMPBEBCMF'POUהכ

Slide 11

Slide 11 text

˖ فؚٗٓئַا٦أַ׵《䖤ׅ׷ %PXOMPBEBCMF'POUהכ

Slide 12

Slide 12 text

˖ فؚٗٓئַا٦أַ׵《䖤ׅ׷ ˖ (PPHMF1MBZ4FSWJDFTח'POU1SPWJEFSָ֮׶
 ׉ַֿ׵《䖤ׅ׷ %PXOMPBEBCMF'POUהכ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPL BOEGFFMEPXOMPBEBCMFGPOUTIUNM״׶

Slide 13

Slide 13 text

˖ فؚٗٓئַا٦أַ׵《䖤ׅ׷ ˖ (PPHMF1MBZ4FSWJDFTח'POU1SPWJEFSָ֮׶
 ׉ַֿ׵《䖤ׅ׷ ˖ ،فٔחؿؓٝز׾㙵׭鴥תזְ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPL BOEGFFMEPXOMPBEBCMFGPOUTIUNM״׶ %PXOMPBEBCMF'POUהכ

Slide 14

Slide 14 text

˖ فؚٗٓئַا٦أַ׵《䖤ׅ׷ ˖ (PPHMF1MBZ4FSWJDFTח'POU1SPWJEFSָ֮׶
 ׉ַֿ׵《䖤ׅ׷ ˖ ،فٔחؿؓٝز׾㙵׭鴥תזְ ˖ ،فٔחؿؓٝز׾湫䱸تؐٝٗ٦س׃זְ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPL BOEGFFMEPXOMPBEBCMFGPOUTIUNM״׶ %PXOMPBEBCMF'POUהכ

Slide 15

Slide 15 text

˖ فؚٗٓئַا٦أַ׵《䖤ׅ׷ ˖ (PPHMF1MBZ4FSWJDFTח'POU1SPWJEFSָ֮׶
 ׉ַֿ׵《䖤ׅ׷ ˖ ،فٔחؿؓٝز׾㙵׭鴥תזְ ˖ ،فٔחؿؓٝز׾湫䱸تؐٝٗ٦س׃זְ ˖ (PPHMF1MBZ4FSWJDFTָؿؓٝز׾
 ٍؗحءُ׃גְֶגֻ׸׷ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPL BOEGFFMEPXOMPBEBCMFGPOUTIUNM״׶ %PXOMPBEBCMF'POUהכ

Slide 16

Slide 16 text

%PXOMPBEBCMF'POUךًٔحز

Slide 17

Slide 17 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ %PXOMPBEBCMF'POUךًٔحز

Slide 18

Slide 18 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 %PXOMPBEBCMF'POUךًٔحز

Slide 19

Slide 19 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ %PXOMPBEBCMF'POUךًٔحز

Slide 20

Slide 20 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ ˖ "1,؟؎ؤ׾幾׵ׇ׷ %PXOMPBEBCMF'POUךًٔحز

Slide 21

Slide 21 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ ˖ "1,؟؎ؤ׾幾׵ׇ׷ ˖ ׉׸ח״׶،فٔך؎ٝأز٦ٕ䧭⸆桦ָ㟓װׇ׷ %PXOMPBEBCMF'POUךًٔحز

Slide 22

Slide 22 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ ˖ "1,؟؎ؤ׾幾׵ׇ׷ ˖ ׉׸ח״׶،فٔך؎ٝأز٦ٕ䧭⸆桦ָ㟓װׇ׷ ˖ 'POU׾➭ך،فٔהءؑ،דֹ׷ %PXOMPBEBCMF'POUךًٔحز

Slide 23

Slide 23 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ ˖ "1,؟؎ؤ׾幾׵ׇ׷ ˖ ׉׸ח״׶،فٔך؎ٝأز٦ٕ䧭⸆桦ָ㟓װׇ׷ ˖ 'POU׾➭ך،فٔהءؑ،דֹ׷ ˖ 鸐⥋ꆀך⵴幾 %PXOMPBEBCMF'POUךًٔحز

Slide 24

Slide 24 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ ˖ "1,؟؎ؤ׾幾׵ׇ׷ ˖ ׉׸ח״׶،فٔך؎ٝأز٦ٕ䧭⸆桦ָ㟓װׇ׷ ˖ 'POU׾➭ך،فٔהءؑ،דֹ׷ ˖ 鸐⥋ꆀך⵴幾 ˖ ًٌٔך⢪欽ꆀך⵴幾 %PXOMPBEBCMF'POUךًٔحز

Slide 25

Slide 25 text

˖ ؕأةيؿؓٝز׾黝䘔דֹ׷ ˖ وذٔ،ٕرؠ؎ٝך黝䘔 ˖ 畭劣㔿剣ךؿؓٝز׾⢪׻זֻ⳿勻׷ ˖ "1,؟؎ؤ׾幾׵ׇ׷ ˖ ׉׸ח״׶،فٔך؎ٝأز٦ٕ䧭⸆桦ָ㟓װׇ׷ ˖ 'POU׾➭ך،فٔהءؑ،דֹ׷ ˖ 鸐⥋ꆀך⵴幾 ˖ ًٌٔך⢪欽ꆀך⵴幾 ˖ ر؍أؙأل٦أך⵴幾 %PXOMPBEBCMF'POUךًٔحز

Slide 26

Slide 26 text

%PXOMPBEBCMF'POUך ➬穈׫ָろת׸גְ׷ 'POU3FTPVSDFחאְג

Slide 27

Slide 27 text

'POU3FTPVSDF

Slide 28

Slide 28 text

SFTGPOUIPHFIPHFUUG̔3GPOUIPHFIPHF 'POU3FTPVSDF

Slide 29

Slide 29 text

SFTGPOUIPHFIPHFUUG̔3GPOUIPHFIPHF 5FYU7JFXBOESPJEGPOU'BNJMZˑ!GPOUIPHFIPHF˒ 'POU3FTPVSDF

Slide 30

Slide 30 text

SFTGPOUIPHFIPHFUUG̔3GPOUIPHFIPHF 5FYU7JFXBOESPJEGPOU'BNJMZˑ!GPOUIPHFIPHF˒ #VOEMFE'POUה%PXOMPBEBCMF'POUך珏겲֮׷ 'POU3FTPVSDF

Slide 31

Slide 31 text

˖ ؿؓٝزؿ؋؎ٕד׉ךתת縧ֻ PUG UUG UUD 'POU3FTPVSDF #VOEMFE'POUؿؓٝزؿ؋؎ٕ

Slide 32

Slide 32 text

'POU3FTPVSDF #VOEMFE'POUGPOUGBNJMZ YNM UFYU4UZMFח״׏ג⢪ֲؿؓٝز׾㢌ִ׷

Slide 33

Slide 33 text

%PXOMPBEBCMF'POU׾
 黝䘔ׅ׷倯岀׾鋅גְֹת ׃׳ֲ

Slide 34

Slide 34 text

%PXOMPBEBCMF'POU וֲװ׏ג黝䘔ׅ׷ַ "OESPJE4UVEJPךٖ؎،ؐزⰻדGPOU'BNJMZ׾鼅䫛׃ .PSF'POUT׾鼅ע

Slide 35

Slide 35 text

%PXOMPBEBCMF'POU וֲװ׏ג黝䘔ׅ׷ַ ˖ ؿؓٝز׾鼅䫛ׅ׷

Slide 36

Slide 36 text

%PXOMPBEBCMF'POU וֲװ׏ג黝䘔ׅ׷ַ ˖ $SFBUFEPXOMPBEBCMFGPOU׾鼅䫛ׅ׷

Slide 37

Slide 37 text

%PXOMPBEBCMF'POU וֲװ׏ג黝䘔ׅ׷ַ 0,׾䬃ׅ

Slide 38

Slide 38 text

וֲװ׏ג黝䘔ׅ׷ַ 㸣䧭

Slide 39

Slide 39 text

ֿך㢌刿ד،فָٔ וֲז׏׋ַ NPEJFESFTMBZPVUBDUJWJUZ@NBJOYNM NPEJFE"OESPJE.BOJGFTUYNM OFXMFSFTGPOUEBZT@POFYNM OFXMFSFTWBMVFTGPOU@DFSUTYNM OFXMFSFTWBMVFTQSFMPBEFE@GPOUTYNM

Slide 40

Slide 40 text

㢌刿挿

Slide 41

Slide 41 text

BDUJWJUZ@NBJOYNM EBZT@POFYNM 5FYU7JFXד'POU3FTPVSDF׾䭷㹀ׅ׷

Slide 42

Slide 42 text

%PXOMPBEBCMF'POUך'POU3FTPVSDF

Slide 43

Slide 43 text

⟃♴׾䭷㹀ׅ׷ ٥ؿؓٝزせ (PPHMF1MBZ4FSWJDFT ٥ػح؛٦آせ ٥BVUIPSJUZ ٥縭せָ剅ְג֮׷ٔا٦أ

Slide 44

Slide 44 text

縭せؿ؋؎ٕדכꞿְ
 俑㶵⴨ָろת׸גְ׷ 鑫׃ֻכ䖓鶢

Slide 45

Slide 45 text

NBOJGFTUؿ؋؎ٕחQSFMPBEFE@GPOUTָ鷄⸇ׁ׸גְ׷

Slide 46

Slide 46 text

QSFMPBEFE@GPOUTדכ'POU3FTPVSDFָ䭷㹀ׁ׸ծ ֿך'POUָفٔٗ٦سׁ׸׷

Slide 47

Slide 47 text

%PXOMPBEBCMF'POUך➬穈׫

Slide 48

Slide 48 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׶
 㛇劤涸חずׄ

Slide 49

Slide 49 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׶
 㛇劤涸חずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ

Slide 50

Slide 50 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׶
 㛇劤涸חずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ ٥《䖤⯓،فٔך縭せثؑحؙ

Slide 51

Slide 51 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׶
 㛇劤涸חずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ ٥《䖤⯓،فٔך縭せثؑحؙ ٥$POUFOU3FTPMWFSד(PPHMF1MBZ4FSWJDFT ַ׵ؿؓٝز׾《䖤ׅ׷

Slide 52

Slide 52 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׶
 㛇劤涸חずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ ٥《䖤⯓،فٔך縭せثؑحؙ ٥$POUFOU3FTPMWFSד(PPHMF1MBZ4FSWJDFT ַ׵ؿؓٝز׾《䖤ׅ׷ ˟4VQQPSU-JCSBSZ׾ك٦أח鑧׃גְֹתׅ

Slide 53

Slide 53 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׶
 㛇劤涸חずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ ٥《䖤⯓،فٔך縭せثؑحؙ ٥$POUFOU3FTPMWFSד(PPHMF1MBZ4FSWJDFT ַ׵ؿؓٝز׾《䖤ׅ׷ ˟4VQQPSU-JCSBSZ׾ك٦أח鑧׃גְֹתׅ

Slide 54

Slide 54 text

"QQ$PNQBU5FYU7JFXַ׵ 《䖤׃חְֻ

Slide 55

Slide 55 text

"QQ$PNQBU5FYU7JFXַ׵ 《䖤׃חְֻ switch (name) { case "TextView": view = new AppCompatTextView(context, attrs); break; case "ImageView": view = new AppCompatImageView(context, attrs); break; "QQ$PNQBU7JFX*OBUFSKBWB ٖ؎،ؐزךˑ5FYU7JFX˒ך ➿׻׶ח"QQ$PNQBU5FYU7JFXָ ⡲׵׸׷

Slide 56

Slide 56 text

"QQ$PNQBU5FYU7JFXַ׵ 《䖤׃חְֻ "QQ$PNQBU5FYU7JFX؝ٝأزؙٓة ̔"QQ$PNQBU5FYU)FMQFSMPBE'SPN"UUSJCVUFT ̔5JOU5ZQFE"SSBZHFU'POU ֿֿד 3FTPVSDF$PNQBUHFU'POU ׾⢪׏ג'POU׾《䖤ׅ׷

Slide 57

Slide 57 text

ResourcesCompat.FontCallback replyCallback = new ResourcesCompat.FontCallback() { @Override public void onFontRetrieved(@NonNull Typeface typeface) onAsyncTypefaceReceived(textViewWeak, typeface); } @Override public void onFontRetrievalFailed(int reason) { // Do nothing. } }; try { // Note the callback will be triggered on the UI thread. mFontTypeface = a.getFont(fontFamilyId, mStyle, replyCallback); // If this call gave us an immediate result, ignore any "QQ$PNQBU5FYU)FMQFS $BMM#BDL׾⡲䧭

Slide 58

Slide 58 text

@Override public void onFontRetrievalFailed(int reason) { // Do nothing. } }; try { // Note the callback will be triggered on the UI thread mFontTypeface = a.getFont(fontFamilyId, mStyle, replyCallback); // If this call gave us an immediate result, ignore any pending callbacks. mAsyncFontPending = mFontTypeface == null; } catch (UnsupportedOperationException | Resources.NotFoundException e) { // Expected if it is not a font resource. } private void onAsyncTypefaceReceived(WeakReference

Slide 59

Slide 59 text

private void onAsyncTypefaceReceived(WeakReference textViewWeak, Typeface typeface) { if (mAsyncFontPending) { mFontTypeface = typeface; final TextView textView = textViewWeak.get(); if (textView != null) { textView.setTypeface(typeface, mStyle); } } } ꬊず劍דⳢ椚׃ג《䖤דֹ׋׵ UFYU7JFXTFU5ZQFGBDF ד إحزׅ׷

Slide 60

Slide 60 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׷ 㛇劤涸חװ׷ֿהכずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ ٥《䖤⯓،فٔך縭せثؑحؙ ٥ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ ˟4VQQPSU-JCSBSZ׾ك٦أח鑧׃גְֹתׅ

Slide 61

Slide 61 text

1BDLBHF.BOBHFS׾⢪׏ג ػح؛٦آך縭せثؑحؙ ˖ ׍ׯ׿הؿؓٝز׾《䖤ׅ׷⯓ָ(PPHMF1MBZ 4FSWJDFTזךַ׾ثؑحؙׅ׷ ˖ (PPHMF1MBZ4FSWJDFTהػح؛٦آせָずׄז
 ➭ך⩝ך،فַٔ׵⩝ךؿؓٝز׾《䖤׃זְ ״ֲחׅ׷׋׭ך➬穈׫

Slide 62

Slide 62 text

1BDLBHF.BOBHFS׾⢪׏ג ػح؛٦آך縭せثؑحؙ List signatures; PackageInfo packageInfo = packageManager.getPackageInfo(info.packageName, PackageManager.GET_SIGNATURES); signatures = convertToByteArrayList(packageInfo.signatures); … List> requestCertificatesList = request.getCertificates(); for (int i = 0; i < requestCertificatesList.size(); ++i) { ػح؛٦آوط٦آַٍ׵ (PPHMF1MBZ4FSWJDFTך،فٔך ءؚطثٍ׾《䖤׃גغ؎ز⴨חׅ׷ ˑDPNHPPHMFBOESPJEHNT (PPHMF1MBZ4FSWJDFT 'POUT$POUSBDU$PNQBU

Slide 63

Slide 63 text

List> requestCertificatesList = request.getCertificates(); for (int i = 0; i < requestCertificatesList.size(); ++i) { List requestSignatures = new ArrayList<>(requestCertificatesList.get(i)); … if (equalsByteArrayList(signatures, requestSignatures)) { return info; } } return null; غ؎ز⴨׾嫰鯰׃ג♧筰ז׵䞔㜠׾鵤ׅ

Slide 64

Slide 64 text

%PXOMPBEBCMF'POUך➬穈׫ 4VQQPSU-JCSBSZה1MBUGPSNך㹋鄲ָ֮׷ 㛇劤涸חװ׷ֿהכずׄ ٥ "QQ$PNQBU 5FYU7JFXַ׵《䖤׃חְֻ ٥《䖤⯓،فٔך縭せثؑحؙ ٥ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ ˟4VQQPSU-JCSBSZ׾ك٦أח鑧׃גְֹתׅ

Slide 65

Slide 65 text

ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ ؿؓٝزך《䖤כꅾחٓحفׁ׸ג㹋鄲ׁ׸גְ׷ 3FTPVSDF$PNQBU 'POUT$POUSBDU$PNQBU $POUFOU3FTPMWFS ͷॲཧ

Slide 66

Slide 66 text

ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ ؿؓٝزך《䖤כꅾחٓحفׁ׸ג㹋鄲ׁ׸גְ׷ 3FTPVSDF$PNQBU 'POUT$POUSBDU$PNQBU $POUFOU3FTPMWFS ͷॲཧ

Slide 67

Slide 67 text

ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ $POUFOU3FTPMWFSה$POUFOU1SPWJEFSהכ "OESPJEח僓ַ׵֮׷
 ،فٔ꟦דر٦ة׾װ׶《׶ׅ׷➬穈׫

Slide 68

Slide 68 text

➬穈׫ך鍑铡ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ 㹋ꥷח$POUFOU3FTPMWFSד (PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ֿהָ
 דֹתׅ val uri = Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority("com.google.android.gms.fonts") .build() var cursor = contentResolver.query( uri, arrayOf( FontsContractCompat.Columns._ID,

Slide 69

Slide 69 text

val uri = Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority("com.google.android.gms.fonts") .build() var cursor = contentResolver.query( uri, arrayOf( FontsContractCompat.Columns._ID, FontsContractCompat.Columns.FILE_ID, FontsContractCompat.Columns.TTC_INDEX, … ), "query = ?", arrayOf("Days One"), null ) $POUFOU3FTPMWFS׾⢪׏ג《䖤ׅ׷ 'POUせ

Slide 70

Slide 70 text

ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ ؿؓٝزך《䖤כꅾחٓحفׁ׸ג㹋鄲ׁ׸גְ׷ 3FTPVSDF$PNQBU 'POUT$POUSBDU$PNQBU $POUFOU3FTPMWFS ͷॲཧ

Slide 71

Slide 71 text

➬穈׫ך鍑铡 'POUT$POUSBDU$PNQBU ⯓玎ך$POUFOU1SPWJEFSך倯岀חכ縭せثؑحָؙⰅ׏גֶ ׵׆ծ㸜Ⰻדכזְדׅկ 'POUT$POUSBDU׾⢪ֲהػح؛٦آךثؑحؙ׮׃ג㸜Ⰻח 䭯׏גֿ׸תׅկ val request = FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Days One", R.array.com_google_…_fonts_certs_prod ) FontsContractCompat.requestFont( this, request, object : FontsContractCompat.FontRequestCallback() {

Slide 72

Slide 72 text

val request = FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Days One", R.array.com_google_…_fonts_certs_prod ) FontsContractCompat.requestFont( this, request, object : FontsContractCompat.FontRequestCallback() override fun onTypefaceRetrieved(typeface: Type textView.typeface = typeface } override fun onTypefaceRequestFailed(reason: In super.onTypefaceRequestFailed(reason) } }, Handler() 'POU3FRVFTU׾⡲䧭 $POUFOU3FTPMWFSח䗳銲ז"VUIPSJUZせװ ؿؓٝزせծ 縭せָⰅ׏גְ׷ٔا٦أ׾䭷㹀ׅ׷

Slide 73

Slide 73 text

val request = FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Days One", R.array.com_google_…_fonts_certs_prod ) FontsContractCompat.requestFont( this, request, object : FontsContractCompat.FontRequestCallback() override fun onTypefaceRetrieved(typeface: Type textView.typeface = typeface } override fun onTypefaceRequestFailed(reason: In super.onTypefaceRequestFailed(reason) } }, Handler() ) 'POU3FRVFTU׾⢪׏גծ 'POUT$POUSBDU$PNQBUד䭯׏גֻ׷

Slide 74

Slide 74 text

quest = FontRequest( m.google.android.gms.fonts", m.google.android.gms", ys One", rray.com_google_…_fonts_certs_prod ontractCompat.requestFont( this, request, object : FontsContractCompat.FontRequestCallback() { override fun onTypefaceRetrieved(typeface: Typeface?) { textView.typeface = typeface } override fun onTypefaceRequestFailed(reason: Int) { super.onTypefaceRequestFailed(reason) } }, Handler() 《׏גֿ׸׋؝٦ٕغحؙד 5FYU7JFXךUZQFGBDFחإحزׅ׷

Slide 75

Slide 75 text

ؿؓٝزך《䖤כ$POUFOU3FTPMWFSד
 խ(PPHMF1MBZ4FSWJDFTַ׵《䖤ׅ׷ ؿؓٝزך《䖤כꅾחٓحفׁ׸ג㹋鄲ׁ׸גְ׷ 3FTPVSDF$PNQBU 'POUT$POUSBDU$PNQBU $POUFOU3FTPMWFS ͷॲཧ

Slide 76

Slide 76 text

3FTPVSDF$PNQBU׾⢪׏ג 'POU3FTPVSDF׾《׶⳿ׅ 'POUT$POUSBDU$PNQBUכ$POUFOU1SPWJEFS״׶嚂דָׅծ
 (PPHMF1MBZ4FSWJDFTךػح؛٦آせ䭷㹀׃׋׶הַ㣐㢌דׅ ⯓玎铡僇׃גְ׋'POU3FTPVSDF׾⢪׏ג׫ת׃׳ֲ 'POU3FTPVSDFד⯓玎剅ְגְ׋ػح؛٦آせזוָ鎸鯹ׁ׸גְ תׅ

Slide 77

Slide 77 text

3FTPVSDFT$PNQBU fontText.typeface = ResourcesCompat.getFont(this, R.font.orbitron) 3FTPVSDFT$PNQBU׾⢪׏׋ؿؓٝزפך،ؙإأ ַז׶ׅ׏ֹ׶׃ת׃׋կ

Slide 78

Slide 78 text

3FTPVSDFT$PNQBU fontText.typeface = ResourcesCompat.getFont(this, R.font.orbitron) 3FTPVSDFT$PNQBU׾⢪׏׋ؿؓٝزפך،ؙإأ ַז׶ׅ׏ֹ׶׃ת׃׋կ ❌.BJO5ISFBE׾ـٗحؙ׃ג 《䖤ׅ׷ךד岣䠐ָ䗳銲דׅկ

Slide 79

Slide 79 text

3FTPVSDFT$PNQBU ResourcesCompat.getFont( this, R.font.orbitron, object : ResourcesCompat.FontCallback() { override fun onFontRetrieved(typeface: Typeface) { fontText.typeface = typeface } override fun onFontRetrievalFailed(reason: Int) { } }, Handler()) ꬊず劍ד《䖤׮דֹתׅկ 4VQQPSU-JCַ׵鷄⸇ׁ׸׋ًاحس

Slide 80

Slide 80 text

וך״ֲח %PXOMPBEBCMF'POU׾ ⢪׏גְַֻ

Slide 81

Slide 81 text

ת׌%PXOMPBEBCMF'POUח 傈劤铂כזְדׅ

Slide 82

Slide 82 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝

Slide 83

Slide 83 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝ Get Started with the Google Fonts for Android ͱ͍͏ϖʔδʹҎԼͷΑ͏ʹ͋Γ·͢

Slide 84

Slide 84 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝ Get Started with the Google Fonts for Android ͱ͍͏ϖʔδʹҎԼͷΑ͏ʹ͋Γ·͢ fonts.google.comʹ͋ΔϑΥϯτ͕࢖͑Δʂ

Slide 85

Slide 85 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝

Slide 86

Slide 86 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝ GPOUTHPPHMFDPNⰻחכ傈劤铂GPOUכת׌זְ

Slide 87

Slide 87 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝ GPOUTHPPHMFDPNחכ&BSMZ"DDFTTהְֲ׮ךָ֮׶ծ ׉ךل٦آחכ傈劤铂ؿؓٝزָ֮׶תׅկ ׉ך׋׭ծֿך&BSMZ"DDFTTָ穄׻׸לծ 〳腉䚍כ֮׶׉ֲדׅ GPOUTHPPHMFDPNⰻחכ傈劤铂GPOUכת׌זְ

Slide 88

Slide 88 text

%PXOMPBEBCMF'POUח 傈劤铂ָזְ⟝ HPPHMFTBNQMFTBOESPJE%PXOMPBEBCMF'POUTךJTTVFד ׁׁװַז䫺䫑 搀䠐㄂ ׾׃גְ׷ךדծ❤΄͍͠Ͱ͢

Slide 89

Slide 89 text

%PXOMPBEBCMF'POUכتًד׮ #VOEMFE'POUכ⢪ִ׷ %PXOMPBEBCMF'POUדכזְךדָׅ ׋׌#VOEMFE'POUה׃ג'POU3FTPVSDF׾ Ⰵ׸ג⢪ֲֿהָדֹתׅկ ׉ך儗ךذؙصحؙ׾稱➜׃תׅկ

Slide 90

Slide 90 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ وذٔ،ٕرؠ؎ٝ׌ה傈劤铂כ넝㺘䏝 %FOTF4DSJQU ד /PUPؿؓٝز׾㛇彊ח剅ַ׸גְתׅկ 傈劤铂وذٔ،ٕرؠ؎ٝךة؎هؚٓؿ؍״׶

Slide 91

Slide 91 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ وذٔ،ٕرؠ؎ٝך%FOTFTDSJQUך갪湡״׶

Slide 92

Slide 92 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ

Slide 93

Slide 93 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ ׉׸׊׸㣐ֹׁהؿؓٝزָ 鏣㹀ׁ׸גְ׷

Slide 94

Slide 94 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ <item name="android:textSize">21sp</item> <item name="android:fontFamily">@font/notosans_medium</item> <item name="android:textSize">17sp</item> <item name="android:fontFamily">@font/notosans_regular</item> ׉׸׊׸ך5FYU"QQFBSBODF欽䠐׃גGPOU'BNJMZה㣐ֹׁ׾䭷㹀 ֿֿדGPOUOPUPTBOT@NFEJVNPUGזוד ؿؓٝزؿ؋؎ٕ،فٔחⰅ׸׷ %SPJE,BJHJ״׶

Slide 95

Slide 95 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ

Slide 96

Slide 96 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ

Slide 97

Slide 97 text

'POU3FTPVSDF椚䟝涸ז㼪Ⰵ

Slide 98

Slide 98 text

رؿٕؓزךؿؓٝزך鏣㹀 ذ٦وהַדז׿הַדֹזְַ <item name=“android:textAppearance">@style/TextAppearance.hogehoge</item> <item name=“android:textAppearanceSmall”>@style/TextAppearance..</item> <item name="android:textAppearanceButton">@style/TextAppearance…</item> <item name=“android:textAppearanceMediumInverse”>@style/TextAppearance…</i ɻɻɻɻ ❌דֹ׷ֽו׋ֻׁ׿֮׷կ㣐㢌

Slide 99

Slide 99 text

رؿٕؓزךؿؓٝزך鏣㹀 DISJTKFOY$BMMJHSBQIZ׾⢪ֲ $BMMJHSBQIZהכ"OESPJEךأةٝت٦سזٓ؎ـٓٔד رؿٕؓزךؿؓٝز׾鏣㹀דֹ׷׮ך @Override public void onCreate() { super.onCreate(); CalligraphyConfig.initDefault(new CalligraphyConfig.Builder() .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf") .setFontAttrId(R.attr.fontPath) .build() ); ❌׋׌׃$BMMJHSBQIZכ僓ַ׵֮׷ٓ؎ـٓٔד 倜׃ְ'POU3FTPVSDFכ䭷㹀דֹ׆ծ✼䳔䚍׮זְ

Slide 100

Slide 100 text

رؿٕؓزךؿؓٝزך鏣㹀

Slide 101

Slide 101 text

رؿٕؓزךؿؓٝزך鏣㹀 ˖ ת׋˒$BMMJHSBQIZJTEFBE˒ה⡲罏ָ鎉׏ג
 ְ׷ךדֿ׸ַ׵כ⢪׻זְקֲָ葺ׁ׉ֲ

Slide 102

Slide 102 text

رؿٕؓزךؿؓٝزך鏣㹀 ˖ ת׋˒$BMMJHSBQIZJTEFBE˒ה⡲罏ָ鎉׏ג
 ְ׷ךדֿ׸ַ׵כ⢪׻זְקֲָ葺ׁ׉ֲ ˖ ׍ז׫חNJHSBUJPOHVJEF͸ݟ͔ͭΒͳ͔ͬͨɻɻ

Slide 103

Slide 103 text

ֿךإحءّٝךⰻ㺁

Slide 104

Slide 104 text

ֿךإحءّٝךⰻ㺁

Slide 105

Slide 105 text

ٓ؎ـٓٔ⡲׶ת׃׋

Slide 106

Slide 106 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ

Slide 107

Slide 107 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ $BMMJHSBQIZך➬穈׫׾ⵃ欽׃׋ٓ؎ـٓٔ׾⡲׶ת׃׋

Slide 108

Slide 108 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ $BMMJHSBQIZך➬穈׫׾ⵃ欽׃׋ٓ؎ـٓٔ׾⡲׶ת׃׋ $BMMJHSBQIZず圫חְֲֲֿ䠬ׄד鏣㹀ׅ׷׌ֽ

Slide 109

Slide 109 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ $BMMJHSBQIZך➬穈׫׾ⵃ欽׃׋ٓ؎ـٓٔ׾⡲׶ת׃׋ $BMMJHSBQIZず圫חְֲֲֿ䠬ׄד鏣㹀ׅ׷׌ֽ CalligraphyConfig.initDefault(new CalligraphyConfig.Builder() .setDefaultFont(R.font.roboto_regular) .build());

Slide 110

Slide 110 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ $BMMJHSBQIZך➬穈׫׾ⵃ欽׃׋ٓ؎ـٓٔ׾⡲׶ת׃׋ $BMMJHSBQIZず圫חְֲֲֿ䠬ׄד鏣㹀ׅ׷׌ֽ CalligraphyConfig.initDefault(new CalligraphyConfig.Builder() .setDefaultFont(R.font.roboto_regular) .build()); @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); }

Slide 111

Slide 111 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ

Slide 112

Slide 112 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ %SPJE,BJHJ،فٔד⯋孡ח⹛ְגְתׅ IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODF BQQQVMM

Slide 113

Slide 113 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ %SPJE,BJHJ،فٔד⯋孡ח⹛ְגְתׅ IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODF BQQQVMM ֿֿחְ׷➂ָأة٦׃ג剣せזٓ؎ـٓٔח ז׸ל㸜䗰׃ג⢪ִ׷כ׆!

Slide 114

Slide 114 text

'POU3FTPVSDFד رؿٕؓزؿؓٝز׾䭷㹀׃׋ְ %SPJE,BJHJ،فٔד⯋孡ח⹛ְגְתׅ IUUQTHJUIVCDPN%SPJE,BJHJDPOGFSFODF BQQQVMM UBLBIJSPN%PXOMPBEBCMF$BMMJHSBQIZ IUUQTHJUIVCDPNUBLBIJSPN %PXOMPBEBCMF$BMMJHSBQIZ ֿֿחְ׷➂ָأة٦׃ג剣せזٓ؎ـٓٔח ז׸ל㸜䗰׃ג⢪ִ׷כ׆!

Slide 115

Slide 115 text

ֿֿתדד։ⶴ ׌הل٦أ鸐׶

Slide 116

Slide 116 text

&NPKJ$PNQBU

Slide 117

Slide 117 text

&NPKJ$PNQBUך稱➜ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPLBOEGFFMFNPKJDPNQBUIUNM״׶

Slide 118

Slide 118 text

&NPKJ$PNQBUך稱➜ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPLBOEGFFMFNPKJDPNQBUIUNM״׶ UPIVӎ׾꣇ּֿהָ⳿勻׷

Slide 119

Slide 119 text

&NPKJ$PNQBUך稱➜ IUUQTEFWFMPQFSBOESPJEDPNHVJEFUPQJDTVJMPPLBOEGFFMFNPKJDPNQBUIUNM״׶

Slide 120

Slide 120 text

&NPKJ$PNQBUך稱➜ ˖ 剑倜ך窩俑㶵ָ"OESPJE04ך،حفر٦ز搀׃ ד⢪ִ׷ ˖ ♧僴傈 6OJDPEF&NPKJָ
 ٔٔ٦أׁ׸ծך倜׃ְ窩俑㶵ָ鷄⸇ׁ׸ת ׃׋կ ˖ 鞜臰♶〳鼘דׅկ IUUQCMPHVOJDPEFPSHVOJDPEFFNPKJ DIBSBDUFSTOPXOBMIUNM N

Slide 121

Slide 121 text

&NPKJ$PNQBUך稱➜ ˖ "1*-FWFM ˖ %PXOMPBEBCMF'POU晛ה#VOEMF晛ָ֮׷ ˖ #VOEMF晛כ窩俑㶵ָٓ؎ـٓٔך⚥חⰅ׏גֶ׶
 .#֮׷ךד暴婊ז✲䞔ָזְꣲ׶ծ
 㛇劤涸ח%PXOMPBEBCMF'POU晛ָ葺ְה䙼׻׸׷կ

Slide 122

Slide 122 text

&NPKJ$PNQBUך㛇劤涸ז⢪ְ倯 val fontRequest = FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Noto Color EmojiCompat", R.array.com_google_android_gms_fonts_certs) val config = FontRequestEmojiCompatConfig(context, fontRequest) EmojiCompat.init(config) "QQMJDBUJPOPO$SFBUF

Slide 123

Slide 123 text

&NPKJ$PNQBUך㛇劤涸ז⢪ְ倯 val fontRequest = FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Noto Color EmojiCompat", R.array.com_google_android_gms_fonts_certs) val config = FontRequestEmojiCompatConfig(context, fontRequest) EmojiCompat.init(config) ⯓玎ך'POU3FRVFTU׾⢪׏ג &NPKJ$PNQBUJOJU דⴱ劍⻉ "QQMJDBUJPOPO$SFBUF

Slide 124

Slide 124 text

&NPKJ$PNQBUך㛇劤涸ז⢪ְ倯 val fontRequest = FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Noto Color EmojiCompat", R.array.com_google_android_gms_fonts_certs) val config = FontRequestEmojiCompatConfig(context, fontRequest) EmojiCompat.init(config) ⯓玎ך'POU3FRVFTU׾⢪׏ג &NPKJ$PNQBUJOJU דⴱ劍⻉ "QQMJDBUJPOPO$SFBUF implementation “com.android.support:support-emoji:27.0.2"

Slide 125

Slide 125 text

&NPKJ$PNQBUך㛇劤涸ז⢪ְ倯 … ֮הכ㛇劤涸ח⟃♴ך״ֲח&NPKJָ⢪׻׸׷㜥䨽דծ ׉׸׊׸ך7JFX׾⢪ֲ implementation “com.android.support:support-emoji-appcompat:27.0.2"

Slide 126

Slide 126 text

&NPKJ$PNQBUךٌآُ٦ٕ ˖ אٌآُ٦ָٕ㶷㖈ׅ׷ implementation “com.android.support:support-emoji:27.0.2" implementation “com.android.support:support-emoji-appcompat:27.0.2" implementation “com.android.support:support-emoji-bundled:27.0.2" NBWFOך⣛㶷ꟼ⤘ %PXOMPBE晛 ̔FNPKJBQQDPNQBU #VOEMF晛׾ⵃ欽ׅ׷㜥さ ̔FNPKJCVOEMFE ̔FNPKJBQQDPNQBU

Slide 127

Slide 127 text

&NPKJ$PNQBU$POHח״׷ 鏣㹀 .setEmojiSpanIndicatorEnabled(true) .setEmojiSpanIndicatorColor(Color.GREEN) &NPKJ$PNQBUח״׏ג縧ֹ䳔ִָ遤׻׸׋הֿ׹ָⴓַ׷ رغحؚぢֹ

Slide 128

Slide 128 text

&NPKJ$PNQBU$POHח״׷ 鏣㹀 ءأذيָ邌爙דֹזְ窩俑㶵׌ֽ׾縧ֹ䳔ִ׷ךדכזֻ Ⰻג׾縧ֹ䳔ִ׷ַוֲַ ౷Ұײ࣋ͨͤΔͳΒશ෦ஔ͖׵͓͍͑ͯͨ΄͏͕ྑͦ͞͏ .setReplaceAll(true)

Slide 129

Slide 129 text

➬穈׫חⰅ׷⵸ח 窩俑㶵חאְג

Slide 130

Slide 130 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג val face = "\ud83d\udc68" println(face) println(face.length) +BWBכ鸐䌢ծؽحزךDIBSر٦ة㘗׾⢪ֲ ׃ַ׃ؽحزחⰅ׶ⴖ׵זַ׏׋窩俑㶵זוכ
 ؽحزծאךDIBS׾⢪׏ג邌植ׁ׸׷ ֿך䩛岀׾؟ٗ؜٦زل،הְֲ

Slide 131

Slide 131 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג ؟ٗ؜٦زل،כؽحزך⦼ד邌ֿׅהָ⳿勻׷ ׉׸׾؝٦سه؎ٝزהְֲ 6' =VEE=VED ̓؝٦سه؎ٝز

Slide 132

Slide 132 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג וך؝٦سه؎ٝزָծוך窩俑㶵ח㼎䘔ׅ׷ַ&NPKJ$IBSUTד
 然钠ׅ׷ֿהָ⳿勻׷ IUUQVOJDPEFPSHFNPKJDIBSUTGVMMFNPKJMJTUIUNM

Slide 133

Slide 133 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג ؝٦سه؎ٝز׾《䖤׃׋׶ծ 俑㶵⴨ח湫ֿׅהָדֹ׷

Slide 134

Slide 134 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג // String -> code point val face = "\ud83d\udc68" val codePoint: Int = Character.toCodePoint(face[0], face[1]) println(Integer.toHexString(codePoint)) // code point -> String val charArray: CharArray = Character.toChars(codePoint) val string = String(charArray) println(string) ؝٦سه؎ٝز׾《䖤׃׋׶ծ 俑㶵⴨ח湫ֿׅהָדֹ׷ $IBSBDUFSUP$PEF1PJOUחDIBS׾א床ׅ׌ֽ

Slide 135

Slide 135 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג // String -> code point val face = "\ud83d\udc68" val codePoint: Int = Character.toCodePoint(face[0], face[1]) println(Integer.toHexString(codePoint)) // code point -> String val charArray: CharArray = Character.toChars(codePoint) val string = String(charArray) println(string) $IBSBDUFSUP$IBST ח؝٦سه؎ٝز床ׅ׌ֽ

Slide 136

Slide 136 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג 6'6''#6%6'## ;8+ ;8+俑㶵׾穠さׇׁ׷ⵖ䖴俑㶵 醱侧ך؝٦سه؎ٝزַ׵䕎䧭ׁ׸׷窩俑㶵ָ㶷㖈ׅ׷

Slide 137

Slide 137 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג ךثُ٦زٔ،ٕ ˖ ֿ׸׮&NPKJ$IBSUTךل٦آד然钠דֹ׷

Slide 138

Slide 138 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג 6'6''#6%6'## ;8+ ֿך؝٦سه؎ٝز׾؝٦سד邌植ׅ׷חכ

Slide 139

Slide 139 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג val face = Character.toChars(0x1f468) val lightSkin = Character.toChars(0x1f3fb) val zwj = Character.toChars(0x200d) val computer = Character.toChars(0x1f4bb) val programmer = face + lightSkin + zwj + computer programmer.forEach { println(Integer.toHexString(it.toInt())) } 6'6''#6%6'## ;8+ ֿך؝٦سه؎ٝز׾؝٦سד邌植ׅ׷חכ ֿ׸דת׆כDIBSךBSSBZָ《䖤דֹ׋ 如ךأٓ؎سד˒QSPHSBNNFS˒׾⢪ֲ

Slide 140

Slide 140 text

➬穈׫חⰅ׷⵸ח窩俑㶵חאְג textView.typeface = ResourcesCompat.getFont(this, R.font.noto_color_emoji) textView.text = String(programmer) // or textView.text = "\ud83d\udc68\ud83c\udffb\u200d\ud83d\udcbb" &NPKJ$PNQBUָזֻג׮窩俑㶵כ ⹛ָֻկկ

Slide 141

Slide 141 text

&NPKJ$PNQBUָזְה ٥ؿؓٝز׾Ⰻ鿇縧ֹ䳔ִג׃תֲהծ 窩俑㶵⟃㢩ך鿇ⴓדծؕأةيؿؓٝزָ黝䘔דֹזְկ ٥"OESPJE׌ה兛鸐ך/PUP$PMPS&NPKJ'POU׾铣׫鴥׬儗ח
 &YDFQUJPOָ饯ֹג׃תֲկ ֲ̔תֻ縧ֹ䳔ִאאⴽךؿؓٝزָ䗳銲 &NPKJ$PNQBUכװ׏גְ׷

Slide 142

Slide 142 text

&NPKJ"QQ$PNQBU5FYU7JFXכ וֲװ׏ג窩俑㶵׾⢪ֲַ

Slide 143

Slide 143 text

&NPKJ"QQ$PNQBU5FYU7JFXכוֲ װ׏ג窩俑㶵׾⢪ֲַ

Slide 144

Slide 144 text

&NPKJ"QQ$PNQBU5FYU7JFXכוֲ װ׏ג窩俑㶵׾⢪ֲַ 5SBOTGPSNBUJPO.FUIPEד3FQMBDFNFOU4QBOהְֲؙٓأ׾
 䭁䓸׃׋5ZQFGBDF&NPKJ4QBO׾⢪ֲ 3FQMBDFNFOU4QBOדכESBXًاحس׾ؔ٦غ٦ٓ؎سׅ׸ל ⴽך俑㶵׾䲽歗׃׋׶⳿勻׷ public final class TypefaceEmojiSpan extends EmojiSpan { … @Override public void draw(@NonNull final Canvas canvas, …, @NonNull final Paint paint) { getMetadata().draw(canvas, x, y, paint); } … }

Slide 145

Slide 145 text

public final class TypefaceEmojiSpan extends EmojiSpan { … @Override public void draw(@NonNull final Canvas canvas, …, @NonNull final Paint paint) { getMetadata().draw(canvas, x, y, paint); } … } QBJOUחTFU5ZQFGBDF׃ג DBOWTESBX5FYU ׅ׷׌ֽ &NPKJ.FUBEBUBKBWB public void draw(@NonNull final Canvas canvas, final float x,… @NonNull final Paint paint) { final Typeface typeface = mMetadataRepo.getTypeface(); … paint.setTypeface(typeface); … canvas.drawText(…, paint); }

Slide 146

Slide 146 text

וֲװ׏ג窩俑㶵׌ֽ׾
 5ZQFGBDF&NPKJ4QBOח
 縧ֹ䳔ִגְ׷ַ

Slide 147

Slide 147 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫

Slide 148

Slide 148 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ˖ ׉ְֲֲ"OESPJEך"1*כזׁ׉ֲ

Slide 149

Slide 149 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ˖ ׉ְֲֲ"OESPJEך"1*כזׁ׉ֲ ˖ 'POUؿ؋؎ٕ׾'MBU#VFSד
 铣׫鴥׿ד窩俑㶵ך加圓鸡׾⡲׷

Slide 150

Slide 150 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ˖ ׉ְֲֲ"OESPJEך"1*כזׁ׉ֲ ˖ 'POUؿ؋؎ٕ׾'MBU#VFSד
 铣׫鴥׿ד窩俑㶵ך加圓鸡׾⡲׷ 窩俑㶵ך加圓鸡 知殛⻉幥׫ DMBTT/PEF\ WBMDIJMESFO.BQ*OU /PEF WBMEBUB ^

Slide 151

Slide 151 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ SPPU

Slide 152

Slide 152 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ̒DPEFQPJOUEBUB6' SPPU

Slide 153

Slide 153 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ̒DPEFQPJOUEBUB6' SPPU EBUB'

Slide 154

Slide 154 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ̒DPEFQPJOU6''# OPEFDIJMESFOHFU Y''# ̒DPEFQPJOUEBUB6' SPPU EBUB'

Slide 155

Slide 155 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ̒DPEFQPJOU6''# OPEFDIJMESFOHFU Y''# ̒DPEFQPJOUEBUB6' EBUB' SPPU EBUB'

Slide 156

Slide 156 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ ̒DPEFQPJOU6''# OPEFDIJMESFOHFU Y''# ;8+ 俑㶵׾穠さׇׁ׷ⵖ䖴俑㶵 ̒DPEFQPJOUEBUB6' EBUB'  SPPU EBUB'

Slide 157

Slide 157 text

俑㶵⴨ךוֿתדָ窩俑㶵זךַ ⴻ㹀ׅ׷➬穈׫ EBUB' EBUB' ֿךEBUBך؝٦سه؎ٝزכ&NPKJ$PNQBUךؿؓٝزָ䭯׏גְ׷ 1SJWBUF6TF"SFBחوحؾׁؚٝ׸גְגծ׉ֿ׾⿫撑׃גְ׷ ˖ 'POUؿ؋؎ٕⰻךوحؾؚٝ

Slide 158

Slide 158 text

窩俑㶵׾ⴻ㹀ׅ׷➬穈׫ ֿך加׾⢪׏גծ俑㶵⴨ַ׵א׆א؝٦سه؎ٝز׾ 铣׿דծ孡ח֮׷EBUB׾黝䘔׃גְֻ int currentOffset = start; int codePoint = Character.codePointAt(charSequence, currentOffset); while (currentOffset < end && addedCount < maxEmojiCount) { final int action = sm.check(codePoint); switch (action) { case ACTION_ADVANCE_BOTH: start += Character.charCount(Character.codePointAt(charSequence, start)); currentOffset = start; if (currentOffset < end) { codePoint = Character.codePointAt(charSequence, currentOffset); } …

Slide 159

Slide 159 text

וֲװ׏ג&NPKJ$PNQBU׾ ⢪׏גְַֻ ˖ 知⽃חⵃ欽דֹ׷ ˖ %PXOMPBEBCMF'POU晛ֶָׅׅ׭կ ˖ ׋ֻׁ׿俑㶵ָ⳿׷،فٔדכծ邌植ָ㟓ִ׷ךד 葺ְ ˖ 㛇劤涸חⰋגך窩俑㶵׾縧ֹ䳔ִ׷3FQMBDF"MM׾㛇 劤涸ח⢪׏גְֻךָ葺ׁ׉ֲկ

Slide 160

Slide 160 text

&NPKJ$PNQBUכ"1*-FWFM 窩俑㶵ؿؓٝزָⵃ欽דֹ׷״ֲחז׏׋ךָ"1* -FWFMַ׵ד֮׷׋׭ծ &NPKJ$PNQBUך堣腉כ"1*-FWFM劢弫כ⢪ֲֿהָ דֹזְկ

Slide 161

Slide 161 text

&NPKJ$PNQBUכ"1*-FWFM ˖ "1*-FWFM劢弫דכ׋׌ך5FYU7JFXה׃ג䪔ֲ׋ ׭ծֿ׸תדוֶ׶ך⹛ָֹדֹ׷կ ˖ 兛鸐ךفٗتؙزדכ劢弫ךِ٦ؠ٦侧כ
 㼰זֻז׏גְ׷ךדծ孡ח׃זֻג葺ׁ׉ֲ ˖ 8IFOVTFEPOEFWJDFTSVOOJOH"1*PSCFMPX UIJTXJEHFUBDUTBTB SFHVMBS\!MJOL"QQ$PNQBU5FYU7JFX^ &NPKJ"QQ$PNQBU5FYU7JFXך؝ًٝز

Slide 162

Slide 162 text

%PXOMPBEBCMF'POUךذأز倯岀 ذأز倯岀 ˖ ؒىُٖ٦ة٦דװ׷㜥さכ1MBZ4UPSF晛׾؎ٝأز٦ٕ

Slide 163

Slide 163 text

%PXOMPBEBCMF'POUךذأز倯岀 ذأز倯岀 ˘ַ׵(PPHMF1MBZTFSWJDFTךغ٦آّٝ،حفָדֹ׷

Slide 164

Slide 164 text

%PXOMPBEBCMF'POUךذأز倯岀 ذأز倯岀 ׉ֲׅ׷ה⹛ֻ

Slide 165

Slide 165 text

ذأز倯岀 ˖ 㛇劤涸ח縧ֹ䳔׻׏גְ׷ַוֲַד然钠ָדֹ ׷ ˖ ؿؓٝزך麩ְכ然钠ׅ׷ךָ㔭ꨇזךדծ NVSPPLBHPEJJNBHFזוד然钠ׅ׷ה葺ַ׏ ׋ ˖ ֲתֻ⹛ַזְהֹכ4VQQPSU-JCSBSZזךדծ兛 鸐חرغحؚד鋅׸׷׃؝٦س׮铣׭׷ ˖ 4VQQPSU-JCSBSZך刿倜㾶娖׾׫גְ׋׌ֽ׷הغ ؚؿ؍حؙأ׾걼籕ח׃גְ׷״ֲזךדծ岣鋔 ׃׋קֲָ葺ׁ׉ֲ

Slide 166

Slide 166 text

תה׭ ˖ %PXOMPBEBCMF'POU׮&NPKJ$PNQBU׮ׅ׀ֻ知⽃ח ⢪ִתׅ ˖ %PXOMPBEBCMF$BMMJHSBQIZ׾أة٦אֽגֻ׌ְׁ⭐ ˖ %PXOMPBEBCMF'POUכ婍䙀זָ׵➙כ傈劤铂ח㼎䘔׃ גְ·ͤΜ͕ɺͦͷ͏ͪରԠ͢Δ͔΋͠Ε·ͤΜ ˖ &NPKJ$PNQBUָ"1*-FWFMד֮׷⟝כ劢弫ך
 ِ٦ؠ٦כ㼰זֻז׏גְגծ⢪ִזְ׻ֽדכזְ ךד⢪׏׍ׯ׏ג葺ׁ׉ֲ

Slide 167

Slide 167 text

⿫罋俑柃 䒷欽 ˖ "OESPJE%FWFMPQFSTIUUQTEFWFMPQFSBOESPJEDPNJOEFYIUNM ˖ "OESPJE0QFO4PVSDF1SPKFDUIUUQTTPVSDFBOESPJEDPN ˖ &NPKJ$IBSUTIUUQVOJDPEFPSHFNPKJDIBSUTGVMMFNPKJMJTUIUNM ˖ &YQMPSJOHUIF"OESPJE&NPKJ$PNQBU-JCSBSZIUUQTNFEJVNDPNFYQMPSJOHBOESPJE FYQMPSJOHUIFBOESPJEFNPKJDPNQBUJCJMJUZMJCSBSZCGCCBB ˖ (PPHMF*0IUUQTXXXZPVUVCFDPNXBUDI W/,WF+'6 ˖ QPUBUPUJQTד"OESPJEך'POUワ׶ך倜堣腉חאְג涪邌׃ת׃׋կIUUQT RJJUBDPNUTVZPTIJUFNTCFED ˖ +BWBח״׷6OJDPEF؟ٗ؜٦زفؚٗٓىؚٝIUUQTXXXJCNDPN EFWFMPQFSXPSLTKQZTMMJCSBSZKBWBKVOJDPEF@TVSSPHBUFJOEFYIUNM ˖ "OESPJEָד窩俑㶵ח׍ׯ׿ה㼎䘔׃׋IUUQTNTUTTLCMPHTQPUKQ FNPKJIUNM

Slide 168

Slide 168 text

؟ٝفٕ IUUQTHJUIVCDPNUBLBIJSPNESPJELBJHJGPOUT