Solarex's Blog


Android Custom View

| Comments

Subclass View

  • onMeasure
    • MeasureSpec
    • setMeasureDimension
  • onLayout
    • layout(left, top, right, bottom)
  • onDraw
    • Canvas

While viewgroups dont generally draw any content of their own,there are many situations where this could be useful,there are help instances where we can ask viewgroup to do some drawing.The first is inside the method dispatchDraw() after super.dispatchDraw has been called,at this stage,child views have already been drawn and we have an opportunity to do additional drawing on top.The second is using the same onDraw() callback as in view.Anything we draw here will be drawn before the child view and thus will show us underneath them,this can be helpful for drawing any type of dynamic backgrounds or selector states if you wish to put code into the onDraw of a ViewGroup.Dont forget to enable drawing callbacks of ViewGroup by setWillNotDraw(false),otherwise ViewGroup’s onDraw callback will never be triggered,this is because ViewGroup by default has its onDraw callback disabled.

Applying Custom Attributes


  • checkLayoutParams(ViewGroup.LayoutParams)
  • generateLayoutParams(ViewGroup.LayoutParams)
  • generateLayoutParams(AttributeSet)
  • generateDefaultLayoutParams()

Handling Layout Events

  • onSizeChanged

Making the view interactive

Handling Input Gestures

Use hardware acceleration

You can control hardware acceleration at the following levels:

  • Application level,<application android:hardwareAccelerated="true" ...>
  • Activity level,<activity android:hardwareAccelerated="false" />
  • Window level,getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  • View level,myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

If you must check whether your view is hardware acclerated in your drawing code,use Canvas.isHardwareAccelerated() instead of View.isHardwareAccelerated() when possible. When a view is attached to a hardware accelerated window, it can still be drawn using a non-hardware accelerated Canvas. This happens, for instance, when drawing a view into a bitmap for caching purposes.