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
Who I am…
Software engineer!
GDG Barcelona organizer
Android lover!
Geek
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.
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
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
View.onAttachedToWindow()
View.onDetachedFromWindow()
View added
Animate View
View.onMeasure()
View.onLayout()
View.onDraw()
View removed
Rendering
loop
View lifecycle
Many reasons to go custom:!
!
Performance!
!
Flexibility!
!
Innovation!
!
Reusability
To remember: there is no custom view composition :(
Views: going custom…
Views: going custom…
Measuring!
!
Layouting!
!
Drawing!
!
Saving state!
!
Handling events
View responsibilities
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
It tells Android how big you want your custom view
to be, taking into consideration the layout
constraints provided by the parent.
onMeasure()
Called from layout when the view should assign a
size and position to each of its children. Used
frequently when extending ViewGroup.
onLayout()
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()
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()
There are 3 different ways:!
!
Compound Views!
!
Custom Compound Views!
!
Flat Custom Views
Implementing custom views
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
Compound views
Compound views
Is a compound view which overrides onMeasure(),
onLayout() and extends ViewGroup.
Custom compound views
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
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
To use custom attributes already defined, in your
layout file you have to declare them in the XML
header as following:
Using custom attributes
Reading custom attributes in code
We implement onTouchEvent() to handle touch
screen motion events.
Making our view to react…
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
The View class supports the creation of an
image of its current display.
Creating screenshots of views
Enabling “show layout bounds” options on the
developer options screen.
Real world examples
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
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
Questions?
Thanks!!!
@fernando_cejas!
http://www.android10.org/!
http://github.com/android10
Java Developers never RIP,
they just get GARBAGE
COLLECTED…

How to Become the MacGyver of Android Custom Views

  • 1.
    How to becomethe 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
  • 2.
    Who I am… Softwareengineer! GDG Barcelona organizer Android lover! Geek
  • 3.
    How android drawsview 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.
  • 4.
    Drawing the layoutis a three pass process:! Measure! Layout! Draw In terms of methods in View class:! requestLayout(): measure + layout! invalidate(): draw How android draws view hierarchy
  • 5.
    View! 19.572 lines ImageView! 1.260 lines TextView! 9.220lines ViewGroup! 6.771 lines Button! 121 lines LinearLayout! 1.898 lines RelativeLayout! 1.812 lines …! … lines View framework
  • 6.
  • 7.
    Many reasons togo custom:! ! Performance! ! Flexibility! ! Innovation! ! Reusability To remember: there is no custom view composition :( Views: going custom…
  • 8.
  • 9.
  • 10.
    Encapsulates the layoutrequirements 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
  • 11.
    It tells Androidhow big you want your custom view to be, taking into consideration the layout constraints provided by the parent. onMeasure()
  • 12.
    Called from layoutwhen the view should assign a size and position to each of its children. Used frequently when extending ViewGroup. onLayout()
  • 13.
    Called by Androidwhen 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()
  • 14.
    You need torequest 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()
  • 15.
    There are 3different ways:! ! Compound Views! ! Custom Compound Views! ! Flat Custom Views Implementing custom views
  • 16.
    These are usuallyour 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
  • 17.
  • 18.
  • 19.
    Is a compoundview which overrides onMeasure(), onLayout() and extends ViewGroup. Custom compound views
  • 20.
    It is afully custom view that measures, arranges, and draws all its elements. Extends from View. https://github.com/android10/Android-DonutViews Flat custom views
  • 21.
    To define additionalattributes 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
  • 22.
    To use customattributes already defined, in your layout file you have to declare them in the XML header as following: Using custom attributes
  • 23.
  • 24.
    We implement onTouchEvent()to handle touch screen motion events. Making our view to react…
  • 25.
    For persisting viewstate 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
  • 26.
    The View classsupports the creation of an image of its current display. Creating screenshots of views
  • 27.
    Enabling “show layoutbounds” options on the developer options screen. Real world examples
  • 28.
    Avoid custom viewsif 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
  • 29.
    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
  • 30.
  • 31.