Slide 1

Slide 1 text

How to become the MacGyver of android custom views Angus MacGyver: The man that can kill someone with a paperclip @fernando_cejas! http://www.android10.org/! http://github.com/android10

Slide 2

Slide 2 text

Who I am… Software engineer! GDG Barcelona organizer Android lover! Geek

Slide 3

Slide 3 text

How android draws view hierarchy Drawing begins with the root node of the layout.! ! The layout hierarchy is traversed in the order of declaration.! ! Parents are drawn before their children and children are drawn in the order of declaration.

Slide 4

Slide 4 text

Drawing the layout is a three pass process:! Measure! Layout! Draw In terms of methods in View class:! requestLayout(): measure + layout! invalidate(): draw How android draws view hierarchy

Slide 5

Slide 5 text

View! 19.572 lines ImageView! 1.260 lines TextView! 9.220 lines ViewGroup! 6.771 lines Button! 121 lines LinearLayout! 1.898 lines RelativeLayout! 1.812 lines …! … lines View framework

Slide 6

Slide 6 text

View.onAttachedToWindow() View.onDetachedFromWindow() View added Animate View View.onMeasure() View.onLayout() View.onDraw() View removed Rendering loop View lifecycle

Slide 7

Slide 7 text

Many reasons to go custom:! ! Performance! ! Flexibility! ! Innovation! ! Reusability To remember: there is no custom view composition :( Views: going custom…

Slide 8

Slide 8 text

Views: going custom…

Slide 9

Slide 9 text

Measuring! ! Layouting! ! Drawing! ! Saving state! ! Handling events View responsibilities

Slide 10

Slide 10 text

Encapsulates the layout requirements passed from parent to child.! ! Represents a requirement for either the width or the height. ! ! Is comprised of a size and a mode. There are 3 possible modes:! UNSPECIFIED ! EXACTLY ! AT_MOST MeasureSpec

Slide 11

Slide 11 text

It tells Android how big you want your custom view to be, taking into consideration the layout constraints provided by the parent. onMeasure()

Slide 12

Slide 12 text

Called from layout when the view should assign a size and position to each of its children. Used frequently when extending ViewGroup. onLayout()

Slide 13

Slide 13 text

Called by Android when the view needs to draw itself. Here is the place for the logic related with drawing the different components or content of our view. onDraw()

Slide 14

Slide 14 text

You need to request a new layout if a property changes that might affect the size or shape of the view. You have to invalidate the view after any change to its properties that might change its appearance. requestLayout() invalidate()

Slide 15

Slide 15 text

There are 3 different ways:! ! Compound Views! ! Custom Compound Views! ! Flat Custom Views Implementing custom views

Slide 16

Slide 16 text

These are usually our starting point.! ! Perform pretty well in many situations.! ! Simple to implement. 1. Subclass one of the built-in layouts.! 2. Inflate a merge layout in the constructor.! 3. Initialize members to point to inner views with findViewById().! 4. Add your own APIs to query and update the view state. Compound views

Slide 17

Slide 17 text

Compound views

Slide 18

Slide 18 text

Compound views

Slide 19

Slide 19 text

Is a compound view which overrides onMeasure(), onLayout() and extends ViewGroup. Custom compound views

Slide 20

Slide 20 text

It is a fully custom view that measures, arranges, and draws all its elements. Extends from View. https://github.com/android10/Android-DonutViews Flat custom views

Slide 21

Slide 21 text

To define additional attributes it is a must to create an attrs.xml file in your res/values folder and define them like the following example: Declaring custom attributes

Slide 22

Slide 22 text

To use custom attributes already defined, in your layout file you have to declare them in the XML header as following: Using custom attributes

Slide 23

Slide 23 text

Reading custom attributes in code

Slide 24

Slide 24 text

We implement onTouchEvent() to handle touch screen motion events. Making our view to react…

Slide 25

Slide 25 text

For persisting view state you want to have a look at View.BasedSavedState class. The canvas API allows to create complex graphical effects: Canvas, Paint and Shader classes will help with this. Saving view state Custom and advance drawing

Slide 26

Slide 26 text

The View class supports the creation of an image of its current display. Creating screenshots of views

Slide 27

Slide 27 text

Enabling “show layout bounds” options on the developer options screen. Real world examples

Slide 28

Slide 28 text

Avoid custom views if they are not extremely necessary.! Creating objects ahead of time is an important optimisation. ! Initialise your stuff in OnAttachToWindow() method when possible.! If you do not need complex measurement just use onSizeChanged() method.! If you define own views, ensure you review the ViewConfiguration class.! When using custom attributes always recycle your TypedArray. Tips and tricks

Slide 29

Slide 29 text

The more custom, the less features for free.! ! Avoid premature optimisation.! ! Go custom only on core components.! ! Start with stock widgets and compound views.! ! Do not reinvent the wheel. Wrapping up

Slide 30

Slide 30 text

Questions?

Slide 31

Slide 31 text

Thanks!!! @fernando_cejas! http://www.android10.org/! http://github.com/android10 Java Developers never RIP, they just get GARBAGE COLLECTED…