Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to Become the MacGyver of Android Custom Views

How to Become the MacGyver of Android Custom Views

MacGyver is part Indiana Jones, part Sherlock Holmes.

He can turn a bicycle frame into a blowtorch, disarm a bomb with a hockey ticket, create a time machine with some duct tape and a paper clip or CREATE A CUSTOM VIEW IN ANDROID.

In this talk we will walk through the Android UI framework and learn how to push it to the next level by learning how views work and how to build custom ones that will let us create innovative a UIs.

Fernando Cejas

October 02, 2014
Tweet

More Decks by Fernando Cejas

Other Decks in Programming

Transcript

  1. 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
  2. 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.
  3. 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
  4. 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
  5. Many reasons to go custom:! ! Performance! ! Flexibility! !

    Innovation! ! Reusability To remember: there is no custom view composition :( Views: going custom…
  6. 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
  7. It tells Android how big you want your custom view

    to be, taking into consideration the layout constraints provided by the parent. onMeasure()
  8. Called from layout when the view should assign a size

    and position to each of its children. Used frequently when extending ViewGroup. onLayout()
  9. 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()
  10. 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()
  11. There are 3 different ways:! ! Compound Views! ! Custom

    Compound Views! ! Flat Custom Views Implementing custom views
  12. 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
  13. 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
  14. 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
  15. To use custom attributes already defined, in your layout file

    you have to declare them in the XML header as following: Using custom attributes
  16. 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
  17. The View class supports the creation of an image of

    its current display. Creating screenshots of views
  18. 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
  19. 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