Slide 1

Slide 1 text

ͳΜͱ͔KaigiͷTimetable @MoyuruAizawa

Slide 2

Slide 2 text

MoyuruAizawa Moyuru Aizawa
 Software engineer of CATS Div. CyberAgent Inc. 
 Previously at Pairs Div. Eureka Inc.

Slide 3

Slide 3 text

˙˙˙˙DPOGFSFODFBQQ ˙˙˙˙

Slide 4

Slide 4 text

-BZPVU.BOBHFSͱ͸

Slide 5

Slide 5 text

‣ 3FDZDMFS7JFXͷDIJMEWJFXTͷϨΠΞ΢τΛ୲౰͢ΔϞδϡʔϧ ‣ -BZPVU.BOBHFSΛม͑Δ͜ͱͰ༷ʑͳϨΠΞ΢τΛ࣮ݱ͢Δࣄ͕Ͱ͖ Δ -BZPVU.BOBHFSͱ͸

Slide 6

Slide 6 text

-BZPVU.BOBHFSͱ͸ -JOFBS-BZPVU.BOBHFS (SJE-BZPVU.BOBHFS 4UBHHFSFE(SJE-BZPVU.BOBHFS 'MFYCPY-BZPVU.BOBHFS

Slide 7

Slide 7 text

‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU ‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔ਺ػೳ

Slide 8

Slide 8 text

‣ PO-BZPVU$IJMESFO ‣ TDSPMM7FSUJDBMMZ#ZTDSPMM)PSJ[POUBMMZ#Z ‣ TDSPMM5P ‣ TNPPUI4DSPMM5P ‣ DPNQVUF7FSUJDBM4DSPMM&YUFOUDPNQVUF)PSJ[POUBM4DSPMM&YUFOU ‣ DPNQVUF7FSUJDBM4DSPMM0GGTFUDPNQVUF)PSJ[POUBM4DSPMM0GGTFU ‣ DPNQVUF7FSUJDBM4DSPMM3BOHFDPNQVUF)PSJ[POUBM4DSPMM3BOHF ‣ *UFN1SFGFUDI ‣ *UFN%FDPSBUJPOT ‣ *UFN"OJNBUPST ‣ 1SFEJDUJWF"OJNBUJPOT ‣ ʜ -BZPVU.BOBHFSͷؔ਺ػೳ

Slide 9

Slide 9 text

‣ ϨΠΞ΢τͷॳظԽ ‣ BEBQUFSDIBOHFT ‣ SFRVFTU-BZPVU PO-BZPVU$IJMESFO

Slide 10

Slide 10 text

PO-BZPVU$IJMESFO LayoutManager Recycler

Slide 11

Slide 11 text

PO-BZPVU$IJMESFO LayoutManager Recycler 3FDZDMFSΛ࢖ͬͯͲ͔͔͜Β7JFXΛҾͬுͬͯ͘Δ

Slide 12

Slide 12 text

Recycler Scrap Heap PO-BZPVU$IJMESFO LayoutManager View View View 3FDZDMFS͕͍࣋ͬͯΔTDSBQFEWJFX

Slide 13

Slide 13 text

Recycler Scrap Heap PO-BZPVU$IJMESFO LayoutManager View View View 3FDZDMFS͕͍࣋ͬͯΔTDSBQFEWJFX

Slide 14

Slide 14 text

PO-BZPVU$IJMESFO LayoutManager Recycler Recycled ViewPool View View View 3FDZDMFE7JFX1PPM͕͍࣋ͬͯΔSFDZDMFEWJFX

Slide 15

Slide 15 text

PO-BZPVU$IJMESFO LayoutManager Recycler Recycled ViewPool View View View 3FDZDMFE7JFX1PPM͕͍࣋ͬͯΔSFDZDMFEWJFX

Slide 16

Slide 16 text

PO-BZPVU$IJMESFO LayoutManager Recycler Adapter "EBQUFSܦ༝Ͱ7JFXΛJOqBUF

Slide 17

Slide 17 text

PO-BZPVU$IJMESFO LayoutManager Recycler Adapter View "EBQUFSܦ༝Ͱ7JFXΛJOqBUF

Slide 18

Slide 18 text

PO-BZPVU$IJMESFO LayoutManager Recycler Adapter View "EBQUFSܦ༝Ͱ7JFXΛJOqBUF

Slide 19

Slide 19 text

PO-BZPVU$IJMESFO LayoutManager View "EEWJFX

Slide 20

Slide 20 text

PO-BZPVU$IJMESFO LayoutManager View .FBTVSF

Slide 21

Slide 21 text

PO-BZPVU$IJMESFO LayoutManager View -BZPVU

Slide 22

Slide 22 text

PO-BZPVU$IJMESFO 3FDZDMFS͔Β7JFXΛ΋Β͏
 7JFXΛBEE NFBTVSF MBZPVU ͜ͷҰ࿈ͷ࡞ۀΛ3FDZDMFS7JFX͕DIJMEWJFXTͰຬͨ͞ΕΔ·Ͱߦ͏ LayoutManager Recycler View

Slide 23

Slide 23 text

PO-BZPVU$IJMESFO LayoutManager Recycler View 3FDZDMFS͔Β7JFXΛ΋Β͏
 7JFXΛBEE NFBTVSF MBZPVU ͜ͷҰ࿈ͷ࡞ۀΛ3FDZDMFS7JFX͕DIJMEWJFXTͰຬͨ͞ΕΔ·Ͱߦ͏

Slide 24

Slide 24 text

PO-BZPVU$IJMESFO LayoutManager View "EEWJFX
 .FBTVSF
 -BZPVU 3FDZDMFS͔Β7JFXΛ΋Β͏
 7JFXΛBEE NFBTVSF MBZPVU ͜ͷҰ࿈ͷ࡞ۀΛ3FDZDMFS7JFX͕DIJMEWJFXTͰຬͨ͞ΕΔ·Ͱߦ͏

Slide 25

Slide 25 text

private fun addRow(position: Int, offsetY: Int, isAppend: Boolean, recycler: Recycler): Int { val view = recycler.getViewForPosition(position) addView(view, if (isAppend) -1 else 0) measureChildWithMargins(view, 0, 0) val height = getDecoratedMeasuredHeight(view) val width = getDecoratedMeasuredWidth(view) val top = if (isAppend) offsetY else offsetY - height val bottom = top + height layoutDecoratedWithMargins( view, parentLeft, top, parentLeft + width, bottom) return height } PO-BZPVU$IJMESFO

Slide 26

Slide 26 text

private fun addRow(position: Int, offsetY: Int, isAppend: Boolean, recycler: Recycler): Int { val view = recycler.getViewForPosition(position) addView(view, if (isAppend) -1 else 0) measureChildWithMargins(view, 0, 0) val height = getDecoratedMeasuredHeight(view) val width = getDecoratedMeasuredWidth(view) val top = if (isAppend) offsetY else offsetY - height val bottom = top + height layoutDecoratedWithMargins( view, parentLeft, top, parentLeft + width, bottom) return height } PO-BZPVU$IJMESFO

Slide 27

Slide 27 text

private fun addRow(position: Int, offsetY: Int, isAppend: Boolean, recycler: Recycler): Int { val view = recycler.getViewForPosition(position) addView(view, if (isAppend) -1 else 0) measureChildWithMargins(view, 0, 0) val height = getDecoratedMeasuredHeight(view) val width = getDecoratedMeasuredWidth(view) val top = if (isAppend) offsetY else offsetY - height val bottom = top + height layoutDecoratedWithMargins( view, parentLeft, top, parentLeft + width, bottom) return height } PO-BZPVU$IJMESFO

Slide 28

Slide 28 text

private fun addRow(position: Int, offsetY: Int, isAppend: Boolean, recycler: Recycler): Int { val view = recycler.getViewForPosition(position) addView(view, if (isAppend) -1 else 0) measureChildWithMargins(view, 0, 0) val height = getDecoratedMeasuredHeight(view) val width = getDecoratedMeasuredWidth(view) val top = if (isAppend) offsetY else offsetY - height val bottom = top + height layoutDecoratedWithMargins( view, parentLeft, top, parentLeft + width, bottom) return height } PO-BZPVU$IJMESFO

Slide 29

Slide 29 text

private fun addRow(position: Int, offsetY: Int, isAppend: Boolean, recycler: Recycler): Int { val view = recycler.getViewForPosition(position) addView(view, if (isAppend) -1 else 0) measureChildWithMargins(view, 0, 0) val height = getDecoratedMeasuredHeight(view) val width = getDecoratedMeasuredWidth(view) val top = if (isAppend) offsetY else offsetY - height val bottom = top + height layoutDecoratedWithMargins( view, parentLeft, top, parentLeft + width, bottom) return height } PO-BZPVU$IJMESFO

Slide 30

Slide 30 text

override fun onLayoutChildren(recycler: Recycler, state: State) { var offsetY = parentTop for (position in 0 until itemCount) { offsetY += addRow(position, offsetY, isAppend, recycler) if (offsetY > parentBottom) break } } PO-BZPVU$IJMESFO

Slide 31

Slide 31 text

override fun onLayoutChildren(recycler: Recycler, state: State) { var offsetY = parentTop for (position in 0 until itemCount) { offsetY += addRow(position, offsetY, isAppend, recycler) if (offsetY > parentBottom) break } } PO-BZPVU$IJMESFO

Slide 32

Slide 32 text

override fun onLayoutChildren(recycler: Recycler, state: State) { var offsetY = parentTop for (position in 0 until itemCount) { offsetY += addRow(position, offsetY, isAppend, recycler) if (offsetY > parentBottom) break } } PO-BZPVU$IJMESFO

Slide 33

Slide 33 text

override fun onLayoutChildren(recycler: Recycler, state: State) { var offsetY = parentTop for (position in 0 until itemCount) { offsetY += addRow(position, offsetY, isAppend, recycler) if (offsetY > parentBottom) break } } PO-BZPVU$IJMESFO

Slide 34

Slide 34 text

‣ DIJMEWJFXTͷεϥΠυ ‣ ը໘͔Βग़ͨDIJMEWJFXTͷSFNPWF ‣ ۭ͖εϖʔεʹDIJMEWJFXTͷBEE TDSPMM7FSUJDBMMZ#Z

Slide 35

Slide 35 text

‣ DIJMEWJFXTͷεϥΠυ ‣ ը໘͔Βग़ͨDIJMEWJFXTͷSFNPWF ‣ ۭ͖εϖʔεʹDIJMEWJFXTͷBEE TDSPMM7FSUJDBMMZ#Z

Slide 36

Slide 36 text

‣ DIJMEWJFXTͷεϥΠυ ‣ ը໘͔Βग़ͨDIJMEWJFXTͷSFNPWF ‣ ۭ͖εϖʔεʹDIJMEWJFXTͷBEE TDSPMM7FSUJDBMMZ#Z

Slide 37

Slide 37 text

‣ DIJMEWJFXTͷεϥΠυ ‣ ը໘͔Βग़ͨDIJMEWJFXTͷSFNPWF ‣ ۭ͖εϖʔεʹDIJMEWJFXTͷBEE TDSPMM7FSUJDBMMZ#Z

Slide 38

Slide 38 text

TDSPMM7FSUJDBMMZ#Z

Slide 39

Slide 39 text

TDSPMM7FSUJDBMMZ#Z

Slide 40

Slide 40 text

TDSPMM7FSUJDBMMZ#Z

Slide 41

Slide 41 text

TDSPMM7FSUJDBMMZ#Z

Slide 42

Slide 42 text

TDSPMM7FSUJDBMMZ#Z

Slide 43

Slide 43 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentTop)

Slide 44

Slide 44 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentTop)

Slide 45

Slide 45 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentTop)

Slide 46

Slide 46 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentBottom)

Slide 47

Slide 47 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentBottom)

Slide 48

Slide 48 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentBottom)

Slide 49

Slide 49 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentBottom)

Slide 50

Slide 50 text

TDSPMM7FSUJDBMMZ#Z if (bottom < parentBottom)

Slide 51

Slide 51 text

override fun scrollVerticallyBy(dy: Int, recycler: Recycler, state: State): Int { if (dy == 0) return 0 val actualDy = calculateVerticallyScrollAmount(dy) if (actualDy == 0) return 0 offsetChildrenVertical(-actualDy) if (actualDy > 0) { … } else { … } return actualDy } TDSPMM7FSUJDBMMZ#Z

Slide 52

Slide 52 text

override fun scrollVerticallyBy(dy: Int, recycler: Recycler, state: State): Int { if (dy == 0) return 0 val actualDy = calculateVerticallyScrollAmount(dy) if (actualDy == 0) return 0 offsetChildrenVertical(-actualDy) if (actualDy > 0) { … } else { … } return actualDy } TDSPMM7FSUJDBMMZ#Z

Slide 53

Slide 53 text

override fun scrollVerticallyBy(dy: Int, recycler: Recycler, state: State): Int { if (dy == 0) return 0 val actualDy = calculateVerticallyScrollAmount(dy) if (actualDy == 0) return 0 offsetChildrenVertical(-actualDy) if (actualDy > 0) { … } else { … } return actualDy } TDSPMM7FSUJDBMMZ#Z

Slide 54

Slide 54 text

5JNFUBCMF-BZPVU.BOBHFSͷ࣮૷

Slide 55

Slide 55 text

‣ -JOFBS-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱ7JFXͷϨΠΞ΢τॱ ‣ 7JFXͷߴ͞7JFXʹ͓·͔ͤ ‣ 5JNFUBCMF-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱʺ7JFXͷϨΠΞ΢τॱ ‣ ਖ਼͍͠ॱংͰϨΠΞ΢τ͢Δʹ͸ɺ
 ΧϥϜ൪߸ ϧʔϜ൪߸ ͱ։࢝࣌ؒʹΑͬͯ
 ϨΠΞ΢τ͢΂͖ΞΠςϜͷQPTJUJPOΛࢉग़͢Δඞཁ͕͋Δ ‣ 7JFXͷߴ͞ηογϣϯͷ௕͞ 5JNFUBCMF-BZPVU.BOBHFSͷ࣮૷

Slide 56

Slide 56 text

‣ -JOFBS-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱ7JFXͷϨΠΞ΢τॱ ‣ 7JFXͷߴ͞7JFXʹ͓·͔ͤ ‣ 5JNFUBCMF-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱʺ7JFXͷϨΠΞ΢τॱ ‣ ਖ਼͍͠ॱংͰϨΠΞ΢τ͢Δʹ͸ɺ
 ΧϥϜ൪߸ ϧʔϜ൪߸ ͱ։࢝࣌ؒʹΑͬͯ
 ϨΠΞ΢τ͢΂͖ΞΠςϜͷQPTJUJPOΛࢉग़͢Δඞཁ͕͋Δ ‣ 7JFXͷߴ͞ηογϣϯͷ௕͞ 5JNFUBCMF-BZPVU.BOBHFSͷ࣮૷

Slide 57

Slide 57 text

‣ -JOFBS-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱ7JFXͷϨΠΞ΢τॱ ‣ 7JFXͷߴ͞7JFXʹ͓·͔ͤ ‣ 5JNFUBCMF-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱʺ7JFXͷϨΠΞ΢τॱ ‣ ਖ਼͍͠ॱংͰϨΠΞ΢τ͢Δʹ͸ɺ
 ΧϥϜ൪߸ ϧʔϜ൪߸ ͱ։࢝࣌ؒʹΑͬͯ
 ϨΠΞ΢τ͢΂͖ΞΠςϜͷQPTJUJPOΛࢉग़͢Δඞཁ͕͋Δ ‣ 7JFXͷߴ͞ηογϣϯͷ௕͞ 5JNFUBCMF-BZPVU.BOBHFSͷ࣮૷

Slide 58

Slide 58 text

‣ -JOFBS-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱ7JFXͷϨΠΞ΢τॱ ‣ 7JFXͷߴ͞7JFXʹ͓·͔ͤ ‣ 5JNFUBCMF-BZPVU.BOBHFS ‣ "EBQUFSͷΞΠςϜॱʺ7JFXͷϨΠΞ΢τॱ ‣ ਖ਼͍͠ॱংͰϨΠΞ΢τ͢Δʹ͸ɺ
 ΧϥϜ൪߸ ϧʔϜ൪߸ ͱ։࢝࣌ؒʹΑͬͯ
 ϨΠΞ΢τ͢΂͖ΞΠςϜͷQPTJUJPOΛࢉग़͢Δඞཁ͕͋Δ ‣ 7JFXͷߴ͞ηογϣϯͷ௕͞ 5JNFUBCMF-BZPVU.BOBHFSͷ࣮૷

Slide 59

Slide 59 text

private data class Period( val startUnixMin: Int, val endUnixMin: Int, val columnNumber: Int, val adapterPosition: Int, val positionInColumn: Int ) { val durationMin = endUnixMin - startUnixMin } 5JNFUBCMF-BZPVU.BOBHFSͷ࣮૷ ֤1FSJPEͷ৘ใΛ༧Ίऩू͓ͯ͘͠

Slide 60

Slide 60 text

PO-BZPVU$IJMESFO … Period 0 Period 1 Period 2 Period 3 Period 4 Period 5 Period 6 Period 7 Period 8 Period 0 Period 1 Period 2 Period 3 Period 4 Period 5 Period 6 Period 7 Period 8

Slide 61

Slide 61 text

PO-BZPVU$IJMESFO … Period 0 Period 1 Period 2 Period 3 Period 4 Period 5 Period 6 Period 7 Period 8 Column 0 Column 1 Column 2 -JTUɺ$PMVNO/VNCFSͷ.BQͰͱ͓ͬͯ͘ … … … Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7

Slide 62

Slide 62 text

PO-BZPVU$IJMESFO … Period 0 Period 1 Period 2 Period 3 Period 4 Period 5 Period 6 Period 7 Period 8 Column 0 Column 1 Column 2 … … … Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7

Slide 63

Slide 63 text

PO-BZPVU$IJMESFO … Period 0 Period 1 Period 2 Period 3 Period 4 Period 5 Period 6 Period 7 Period 8 Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Column 0 Column 1 Column 2 Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 … … …

Slide 64

Slide 64 text

TDSPMM7FSUJDBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7

Slide 65

Slide 65 text

TDSPMM7FSUJDBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7

Slide 66

Slide 66 text

TDSPMM7FSUJDBMMZ#Z .BQ͔Β$PMVNOͷ-JTUΛͱͬͯ࣍ͷ1FSJPEΛ௥Ճ͍ͯ͘͠ Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 11

Slide 67

Slide 67 text

TDSPMM7FSUJDBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 9 Period 11 .BQ͔Β$PMVNOͷ-JTUΛͱͬͯ࣍ͷ1FSJPEΛ௥Ճ͍ͯ͘͠

Slide 68

Slide 68 text

TDSPMM7FSUJDBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 9 Period 10 Period 11 .BQ͔Β$PMVNOͷ-JTUΛͱͬͯ࣍ͷ1FSJPEΛ௥Ճ͍ͯ͘͠

Slide 69

Slide 69 text

TDSPMM)PSJ[POUBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 9 Period 10 Period 11

Slide 70

Slide 70 text

TDSPMM)PSJ[POUBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 9 Period 10 Period 11 ࣍ͷΧϥϜͷҰ൪࠷ॳʹඳը͢΂͖1FSJPEΛࢉग़͢Δ

Slide 71

Slide 71 text

TDSPMM)PSJ[POUBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 9 Period 10 Period 11 $PMVNOͷத͔Β.JOJNVN4UBSU"UҎ্.BY&OE"UҎԼͷ1FSJPEΛ୳͢ .JOJNVN4UBSU"U .BY&OE"U

Slide 72

Slide 72 text

TDSPMM)PSJ[POUBMMZ#Z Period 0 Period 1 Period 2 Period 4 Period 6 Period 5 Period 3 Period 8 Period 7 Period 9 Period 10 Period 11 Period 12 $PMVNOͷத͔Β.JOJNVN4UBSU"UҎ্.BY&OE"UҎԼͷ1FSJPEΛ୳͢ .JOJNVN4UBSU"U .BY&OE"U

Slide 73

Slide 73 text

ͻͨ͢ΒੵΈ໦Λ͍ͯ͘͠࡞ۀ

Slide 74

Slide 74 text

‣ IUUQTTQFBLFSEFDLDPNMWMBIPXUPJNQMFNFOU UJNFUBCMFMMBZPVUNBOBHFS ‣ ίʔυ͹͔ͬόʔδϣϯ ‣ IUUQTTQFBLFSEFDLDPNMWMBIPXUPJNQMFNFOUDVTUPN MBZPVUNBOBHFS ‣ -JOFBS-BZPVU.BOBHFSͷϛχϚϜ࣮૷Ͱ-BZPVU.BOBHFSͷ࣮૷ํ๏ Λ঺հ͍ͯ͠Δࢿྉ ิ଍ࢿྉ

Slide 75

Slide 75 text

5IBOLZPV