`
一直飞的菜鸟
  • 浏览: 20887 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于View在Draw的调用顺序

 
阅读更多
摘自http://blog.csdn.net/jzf429/article/details/6575660

Android ListView反复调用getView和getCount
最近做项目发现一个界面当有ListView是,getView和getCount中的log被疯狂调用。一个5个Item的ListView,getView竟然会被反复调用7组。尤其是当ItemView中需要加载图片时,很容易造成GC过多,很容易出现ANR。

原因就在于measure过程,ListView一般都会有好多个Item,而且也会同时显示若干组Item,这些Item的父元素都是这个ListView。

更具Google的解释,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。

对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。

而为什么会有很多组次调用呢?

问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。

所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。

分享到:
评论

相关推荐

    Android-《HenCoderAndroid开发进阶自定义View1-5绘制顺序》的练习项目

    在Android中,每个View的绘制过程主要包括测量(Measure)、布局(Layout)和绘制(Draw)三个阶段,通常称为“三部曲”。在这个项目中,开发者将学习如何控制这些阶段,以实现特定的绘制效果。 1. **测量(Measure)阶段**...

    Android中的View与ViewGroup绘制过程,手势监听顺序与使用

    3. **dispatchDraw()**:遍历子View,调用他们的draw()方法进行绘制。 接下来,我们讨论手势监听。在Android中,手势识别主要通过MotionEvent类来实现,它包含了触摸事件的各种状态,如ACTION_DOWN、ACTION_UP等。...

    安卓源码标记view.zip

    10. **绘制流程**:onDraw()方法是绘制View的核心,但在此之前,系统会调用onMeasure()来确定View的大小,然后是onLayout()来决定位置。最后,onDraw()根据测量和布局的结果进行绘制。 11. **硬件加速**:Android...

    浅谈Android View绘制三大流程探索及常见问题

    在这个过程中,View会调用draw方法来完成绘制过程,draw方法内部会调用onDraw方法,以绘制View的内容。 Android View绘制流程是一个复杂的过程,它涉及到多个步骤和方法的调用。但是,通过了解这三个主要步骤:测量...

    Adroid UI 界面绘制原理分析.rar

    - **Draw阶段**:最后,系统调用`onDraw()`方法来绘制View的内容。这里可以进行自定义绘图操作,如画线、画圆、文字等。 2. **硬件加速**: Android 3.0开始引入硬件加速,通过GPU来加速UI的绘制。默认情况下,...

    ios-view视图区域镂空效果.zip

    这个方法会在视图需要刷新时被系统调用,是进行自定义绘图的地方。 ```swift class CustomView: UIView { override func draw(_ rect: CGRect) { // 在这里进行镂空效果的绘制 } } ``` 2. 在`draw(_ rect:)`...

    深入理解Android中View绘制的三大流程

    绘制顺序是从父View到子View,从上到下,从左到右。ViewRootImpl的`performTraversals()`方法启动这个过程,它会依次调用measure、layout和draw。 除了这三个核心流程,还有一些其他概念需要了解: - **Window**:...

    Adroid UI 界面绘制原理分析.zip

    ViewGroup负责管理其子View,包括位置排列、大小计算以及绘制顺序。 ViewGroup也有自己的`onLayout()`方法来确定子View的位置,以及`onDraw()`方法来绘制自身的边框或者背景。 Android UI的绘制过程分为三个主要...

    android 动画

    关于Frame动画,它是通过`AnimationDrawable`类实现的,它可以加载包含多个帧的资源文件(如.gif或.xml),并在指定的时间间隔内顺序播放每一帧,创造出动画效果。虽然Android系统不直接支持.gif动画,但可以通过...

    android drawing 源码

    `View`的绘制过程遵循一定顺序:首先调用`onMeasure()`确定大小,然后调用`onLayout()`确定位置,最后调用`onDraw()`进行绘制。 3. 层次结构与视图树: Android UI是基于层次结构的,所有的视图都在一个视图树中。...

    SurfaceView实现幸运大抽奖.rar

    - 减少重绘:尽量减少不必要的重绘,只在必要时更新canvas,避免频繁调用`draw()`。 6. **动画控制** 可以使用ValueAnimator或ObjectAnimator来更精细地控制抽奖动画,例如设置旋转速度、加速度等。 7. **抽奖...

    ME上Layer,LayerManager,Sprite,TiledLayer移植到android

    通过维护一个`ArrayList`或`LinkedList`来存储`View`对象,然后在`onDraw()`方法中遍历列表,按顺序调用每个View的`draw()`方法。同时,可以提供接口来添加、删除和调整Layer的顺序。 3. Sprite(精灵) Sprite是...

    Android截取界面长图

    4. 调用`View`的`draw(Canvas)`方法,将内容绘制到`Canvas`上。 5. 保存`Bitmap`到文件,完成截图。 对于截取长图,由于单个屏幕无法容纳全部内容,我们需要滚动屏幕并多次截图,然后将这些图片拼接起来。以下是...

    Android Graphics Architecture.pdf

    5. **WindowManagerService.finishDrawingWindow**: 在完成绘制后,ViewRoot会调用此方法通知WindowManager Service完成窗口的绘制。 #### 五、总结 Android图形架构的核心在于协调不同组件之间的交互,确保高效的...

    Android SurfaceView实现人物动画

    在提供的"教程重要说明.txt"文件中,可能包含了关于如何设置项目、导入代码、运行APK的详细步骤,以及可能遇到的问题和解决方案。"RunmanEnvironmentTest"可能是一个测试类,用于验证SurfaceView动画功能的正确性。 ...

    自绘button修改

    确保在适当的地方调用`recycle()`方法释放Bitmap,以及在不再使用时设置Paint为null。 2. **线程安全**:如果在非UI线程中进行自绘操作,debug模式会对此进行严格检查,因为Android只允许在主线程中更新UI。确保...

    APP开发教程 Java Android移动端开发 4、Android UI进阶(2)-自定义控件 共21页.pptx

    - **绘制过程**(Draw):从根视图开始,调用 `draw()` 方法,先画父节点,再按顺序画同层级的节点。 - 关键方法如 `onDraw()` 用于自定义绘图,`onTouchEvent()` 和 `onKeyDown()` 用于处理用户输入事件。 4. **...

    基于Android平台的软件开发若干关键技术分析.pdf

    绘制(draw)阶段,通过dispatchDraw()方法调用背景View进行绘制,同时利用canvas.saveLayer()保存Layer画布,实现数据的调用,从而完成图表的绘制。 其次,Android提供了多种数据存储技术,包括SharedPreferences...

    Android绘图实现

    Canvas对象在该方法中由系统提供,用于在View上绘制。 3. drawXXX系列方法:Canvas提供了多种draw方法,如drawRect(), drawCircle(), drawBitmap(), drawText()等,用于绘制不同类型的图形和文本。 4. Matrix:...

Global site tag (gtag.js) - Google Analytics