"Как я перестал бояться и полюбил кастомные View" —...

Preview:

DESCRIPTION

Сейчас в Google Play более миллиона приложений, и чтобы привлечь внимание людей, нужно обязательно выделяться на общем фоне. Ещё пару лет назад пользователи Android были не слишком привередливы в том, что касается элементов интерфейса приложений, но сейчас они всё больше привыкают к прекрасному. Этот доклад — небольшой путеводитель в мир этому самого прекрасного. После него, я надеюсь, вы полюбите кастомные View не меньше чем я.

Citation preview

1

2

3

4

ViewGroups

! FrameLayout

! LinearLayout

! RelativeLayout

5

6

View positioning

7

View positioning

! onMeasure

! onLayout

8

onMeasure

9

MeasureSpec

!  Mode

–  EXACTLY –  AT_MOST –  UNSPECIFIED !  Size

10

MeasureSpec modes

!  EXACTLY

–  layout_width=“200dip” –  layout_height=“match_parent” –  layout_weight=“1”

11

MeasureSpec modes

!  AT_MOST

–  layout_width=“wrap_content”

12

MeasureSpec modes

!  UNSPECIFIED

–  ScrollView, ListView

13

onMeasure

14

onLayout

! getMeasuredWidth()

! getMeasuredHeight()

!  сhild.layout(left, top, right, bottom);

15

–  How?

16

–  How?

–  LayoutParams!

17

attrs.xml

18

main.xml

19

LayoutParams

! ViewGroup.LayoutParams

! LinearLayout.LayoutParams

! RelativeLayout.LayoutParams

!  …

20

LayoutParams

! checkLayoutParams(ViewGroup.LayoutParams p)

! generateDefaultLayoutParams()

! generateLayoutParams(ViewGroup.LayoutParams p);

! generateLayoutParams(AttributeSet attrs)

21

PavementLayout.LayoutParams

22

onMeasure

23

24

View interactions

25

Yandex.Maps search card

Motion directions !  Up !  Left & right !  Down

26

Yandex.Maps search card heirarchy

CardSlidingDrawer

ViewPager

Card

27

Touch events

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  children.dispatchTouchEvent

4.  onTouchEvent

28

Touch events sample #1

CardSlidingDrawer

TextView

29

Touch events sample #1

1.  dispatchTouchEvent CardSlidingDrawer

TextView

30

Touch events sample #1

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

CardSlidingDrawer

TextView

31

Touch events sample #1

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

TextView

32

Touch events sample #1

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

4.  onTouchEvent

CardSlidingDrawer

TextView

33

Touch events sample #1

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

4.  onTouchEvent

CardSlidingDrawer

TextView

34

Touch events sample #1

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

4.  onTouchEvent

CardSlidingDrawer

TextView

35

Touch events sample #2

1.  dispatchTouchEvent CardSlidingDrawer

Clickable TextView

36

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

CardSlidingDrawer

Clickable TextView

37

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

Clickable TextView

38

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

Clickable TextView

39

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

Clickable TextView

40

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

Clickable TextView

41

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

Clickable TextView

42

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

CardSlidingDrawer

Clickable TextView

43

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

4.  onTouchEvent

CardSlidingDrawer

Clickable TextView

44

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

4.  onTouchEvent

CardSlidingDrawer

Clickable TextView

45

Touch events sample #2

1.  dispatchTouchEvent

2.  onInterceptTouchEvent

3.  dispatchTouchEvent

4.  onTouchEvent

CardSlidingDrawer

Clickable TextView

46

TouchSlop

! deltaY = Math.abs( event.getY() – startY );

! ViewConfiguration.getScaledTouchSlop();

! view.scrollTo(x,y);

47

VelocityTracker

! VelocityTracker.obtain();

! VelocityTracker.addMovement( event );

! VelocityTracker.computeCurrentVelocity(units);

48

Scroller

!  void fling(…);

!  void View.computeScroll();

! boolean computeScrollOffset();

! int getCurrY();

49

Scroller

50

Wrap-up

! onMeasure & onLayout

! onIntercept & onTouchEvent

! GestureDetector & DragHelper

51

Samples

https://github.com/ArikonUA/yac13

52

Спасибо за внимание

53

Поляков Алексей Разработчик

alexpolyakov@yandex-team.ru

!   @arikon

Recommended