关闭

【自定义View系列】导致View树重新遍历的时机

328人阅读 评论(0) 收藏 举报
分类:

  遍历View树就意味着整个View需要重新对其包含的子视图分配大小并重绘。导致重新遍历的原因主要有三个:
1. 视图本身内部状态变化引起重绘。
2. View树内部添加或者删除了View。
3. View本身的大小及可见性发生变化。

状态的分类

这里写图片描述

  在View视图中定义了多种和界面效果相关的状态。不同的状态一般会显示不同的界面效果,有多种操作会引起这些状态的改变。Android中应用程序是按照消息机制执行的,每次处理一个消息,如果该消息引起状态改变,则代码中仅仅做一些状态标识,然后发送一个异步消息,而不是立即重绘。然后在下一次消息处理中,根据保存的状态数据,绘制不同的界面效果。

  视图中和显示效果相关的状态一共有15种 —— android.graphics.drawable.StateListDrawable类中定义。

selected和focused的区别

  一个窗口中只能有一个视图获得焦点,当用户按键时,获取焦点的视图会变得高亮起来,而一个窗口可以有多个视图处于selected状态。
  按键消息最终会传递到focused视图中,而不是selected视图中。
当某个视图处于pressed状态时,如果将其selected状态设为false,那么该视图的pressed状态就会被清空。
focused状态一般是由按键操作引起的,pressed状态是由触摸消息引起的,selected则完全是由应用程序主动调用 setSlected()进行控制。
当视图重绘时,会根据当前不同的状态选择不同的背景图(selector来定义背景时)。

导致View树重新遍历的总体诱因

导致视图大小发生变化 —— invalidate()
导致ViewGroup重新为子视图分配位置 —— requestLayout()
视图显示情况发生变化需要重绘 —— requestFocus()
这三个函数最终都会调用到ViewRoot中的 schueduleTraversals()函数,该函数会发起一个异步消息,消息处理中调用 performTraversals()开始对整个View进行重新遍历。

invalidate()

能导致调用invalidate()函数的包括三种情况:
1. 调用setVisibility():当应用程序改变视图显示属性时。
2. setSelected():当改变视图Selected状态时。
3. setEnable():当改变视图Enable状态时。

requestLayout()

导致调用requestLayout()函数的情况包括两种:
1. setVisibility(),当应用程序改变视图显示属性时,由于显示或者不显示将影响其他同级视图的位置。
2. 应用程序直接或间接调用到该函数,间接调用是指应用程序调用了View类的其他函数,从而简介调用到requestLayout()。

requestFocus()

一般由程序直接调用,简介调用是指当用户按”上/下”、”左/右”键时,相关的处理逻辑会间接的调用到该函数。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android View原理(View树遍历,View重绘,View动画)

一、屏幕绘图基础 Android中的GUI系统是客户端和服务端配合的窗口系统,即后台运行了一个绘制服务,每个应用程序都是该服务端的一个客户端,当客户端需要绘制时,首先请求服务端创建一个窗口,然后...
  • wtyvhreal
  • wtyvhreal
  • 2015-04-01 10:36
  • 2852

Android自定义View(一)View绘制流程以及invalidate()等相关方法分析

转自:http://blog.csdn.net/yanbober/article/details/46128379/      【工匠若水 http://blog.csdn.net/yanbober】...
  • TokgoLiang
  • TokgoLiang
  • 2016-01-08 10:18
  • 1390

Android 自定义View过度绘制性能优化<7>

在自定义View 里面如果又有很多个子View相互重叠,比如,开发者在一张canvas上面画了N张图片,而N张图片存在重叠,那么很显然就会存在过度绘制的现象. 专家分析的意见如下: 前面有提到过,...
  • qq_31726827
  • qq_31726827
  • 2016-01-11 17:16
  • 2999

Android View系统源码分析(六)—— 导致View树重新遍历的时机

Android View系统源码分析(六)—— 导致View树重新遍历的时机
  • u014608640
  • u014608640
  • 2016-07-04 10:15
  • 345

导致View树遍历的时机

遍历View树意味着整个View需要重新对其包含的子视图分配大小并重绘,导致重新遍历的原因主要有三个 1.视图本身内部状况变化引起重绘。 2.第二个是View树内部添加或者删除了View。 3....
  • stevenhenry
  • stevenhenry
  • 2015-07-29 16:16
  • 452

自定义控件View之onMeasure调用时机源码分析

先上测试代码:MainActivity.javaimport android.app.Activity; import android.os.Bundle; import android.util.L...
  • hty1053240123
  • hty1053240123
  • 2017-08-01 17:56
  • 224

自定义view中onMeasure、onLayout、onDraw、onFinishInflate、onSizeChanged方法调用时机

一般自定义view或viewGroup基本上都会去实现onMeasure、onLayout、onDraw方法,还有另外两个方法是onFinishInflate和onSizeChanged。 on...
  • anhenzhufeng
  • anhenzhufeng
  • 2017-06-06 18:36
  • 1112

android自定义View基础系列一(模仿360手机卫士手机提速动画)

  • 2017-01-12 14:46
  • 26.73MB
  • 下载

Android 自定义View实战系列 :时间轴

前言 Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常见 & 实用的自定义View:时间轴 目录1. 知识...
  • carson_ho
  • carson_ho
  • 2017-07-12 10:14
  • 6546

Material Design系列,自定义Behavior支持所有View

Material Design系列,自定义Behavior支持所有View,继承CoordinatorLayout.Behavior类,实现自己的Behavior,可扩展动画等!
  • yanzhenjie1003
  • yanzhenjie1003
  • 2016-08-14 18:39
  • 9929
    写给自己
    ○ 种一棵树最好的时间是十年前,其次是现在

    ○ 坚持输出,坚持书写,才可以持续成长

    ○ 所有美好事物的成长都是缓慢的

    ○ 既往不恋,未来不迎,当下不杂

    ○ 业精于勤,荒于嬉,行成于思,毁于随

    ○将军赶路 不追小兔

    ○不要拘泥于语言,同样也不要拘泥于行业,眼光放远一点

    ○ 如果某件事你做的不够好,不必介怀,因为以后的每一次每一天你都会做得越来越好

    ○ 此心不于事上磨,更于何处磨此心

    ○ 保持热情,保持求知欲

    ○ 千里之行,始于足下

    ○ 最怕你一生碌碌无为,还安慰自己平凡可贵。

    ○ 对于任何事,要保持自觉积极主动探索尝试。但是如果自己不积极认真地生活,不管得到什么样的回答都没有用。——解忧杂货店
    个人资料
    • 访问:672968次
    • 积分:6925
    • 等级:
    • 排名:第3885名
    • 原创:293篇
    • 转载:52篇
    • 译文:0篇
    • 评论:119条
    个人简介