| page.title=Optimizing the View |
| parent.title=Creating Custom Views |
| parent.link=index.html |
| |
| trainingnavtop=true |
| previous.title=Making the View Interactive |
| previous.link=making-interactive.html |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <h2>This lesson teaches you to</h2> |
| <ul> |
| <li><a href="#less">Do Less, Less Frequently</a></li> |
| </ul> |
| <h2>Try it out</h2> |
| <div class="download-box"> |
| <a href="{@docRoot}shareables/training/CustomView.zip" |
| class="button">Download the sample</a> |
| <p class="filename">CustomView.zip</p> |
| </div> |
| </div> |
| </div> |
| |
| <p>Now that you have a well-designed view that responds to gestures and transitions between states, |
| ensure that the view runs fast. To avoid a UI that feels sluggish or stutters during playback, |
| ensure that animations consistently run at 60 frames per second.</p> |
| |
| <h2 id="less">Do Less, Less Frequently</h2> |
| |
| <p>To speed up your view, eliminate unnecessary code from routines that are called frequently. Start |
| by working on |
| {@link android.view.View#onDraw onDraw()}, which will give you the biggest payback. In particular |
| you should eliminate |
| allocations in {@link android.view.View#onDraw onDraw()}, because allocations may lead to a garbage |
| collection that |
| would cause a stutter. Allocate objects during initialization, or between animations. Never make an |
| allocation while an |
| animation is running.</p> |
| |
| <p>In addition to making {@link android.view.View#onDraw onDraw()} leaner, also make sure |
| it's called as |
| infrequently as possible. Most calls to {@link android.view.View#onDraw onDraw()} are the result of |
| a call to {@link |
| android.view.View#invalidate() invalidate()}, so eliminate unnecessary calls to {@link |
| android.view.View#invalidate() |
| invalidate()}.</p> |
| |
| <p>Another very expensive operation is traversing layouts. Any time a view calls {@link |
| android.view.View#requestLayout() |
| requestLayout()}, the Android UI system needs to traverse the entire view hierarchy to find out how |
| big each view needs |
| to be. If it finds conflicting measurements, it may need to traverse the hierarchy multiple times. |
| UI designers |
| sometimes create deep hierarchies of nested {@link android.view.ViewGroup ViewGroup} objects in |
| order to get the UI to |
| behave properly. These deep view hierarchies cause performance problems. Make your view hierarchies |
| as shallow as |
| possible.</p> |
| |
| <p>If you have a complex UI, consider writing a custom {@link android.view.ViewGroup |
| ViewGroup} to perform |
| its layout. Unlike the built-in views, your custom view can make application-specific assumptions |
| about the size and |
| shape of its children, and thus avoid traversing its children to calculate measurements. The |
| PieChart example shows how |
| to extend {@link android.view.ViewGroup ViewGroup} as part of a custom view. PieChart has child |
| views, but it never |
| measures them. Instead, it sets their sizes directly according to its own custom layout |
| algorithm.</p> |