上一讲我们介绍了安卓View的各种状态,目前安卓的View一共是10个状态。这些状态相当于是从不同的角度来描述一个View的情况,所以这些状态并不是互斥的,比如,一个View可以同时处在enabled和pressed两个状态。我们把一个View在某一时刻具备的状态的集合称之为状态集。

那么,如果这些都不互斥,那么一个View的一共可以有多少个状态集呢?对,就是210=1024种状态。

于是,View中就有这么一段代码:

final int NUM_BITS = VIEW_STATE_IDS.length / 2;

VIEW_STATE_SETS = new int[1 << NUM_BITS][];

for (int i = 0; i < VIEW_STATE_SETS.length; i++) {

int numBits = Integer.bitCount(i);

int[] set = new int[numBits];

int pos = 0;

for (int j = 0; j < orderedIds.length; j += 2) {

if ((i & orderedIds[j+1]) != 0) {

set[pos++] = orderedIds[j];

}

}

VIEW_STATE_SETS[i] = set;

}

VIEW_STATE_IDS上一讲有介绍过,VIEW_STATE_IDS存放的是状态的标记位和属性值,所以VIEW_STATE_IDS.length的值是20,NUM_BITS的值就是10。VIEW_STATE_SETS就是定义的状态集的合集,它的大小正是1024。

接下来的代码就是在构造这1024个状态集。

确实有点夸张了,状态集太多了,实际上也根本不可能存在那么多的状态集。

于是,View里面最终选定了27个状态集,它们是:

EMPTY_STATE_SET

WINDOW_FOCUSED_STATE_SET

SELECTED_WINDOW_FOCUSED_STATE_SET

FOCUSED_STATE_SET

FOCUSED_WINDOW_FOCUSED_STATE_SET

FOCUSED_SELECTED_STATE_SET

FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET

ENABLED_STATE_SET

ENABLED_WINDOW_FOCUSED_STATE_SET

ENABLED_SELECTED_STATE_SET

ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET

ENABLED_FOCUSED_STATE_SET

ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET

ENABLED_FOCUSED_SELECTED_STATE_SET

ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET

PRESSED_STATE_SET

PRESSED_WINDOW_FOCUSED_STATE_SET

PRESSED_SELECTED_STATE_SET

PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET

PRESSED_FOCUSED_STATE_SET

PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET

PRESSED_FOCUSED_SELECTED_STATE_SET

PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET

PRESSED_ENABLED_STATE_SET

PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET

PRESSED_ENABLED_SELECTED_STATE_SET

PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET

也就是说,这又上述状态集里的状态组合是有意义的。再换句话说,如果用selector实现不同的状态,最多可以有27种状态。

好了,到目前为止,我们已经介绍了状态系统逻辑层面的设计。那用户是如何看到View的界面的变化呢?是通过Drawable的状态变化。那View的状态和Drawable的状态是怎么连接的呢,是通过一个叫做StateSet的类。

下一讲,我们就重点来讲一讲StateSet。

android view state,Android状态系统(二)——View状态组合相关推荐

  1. View的事件体系之二 View的滑动以及弹性滑动

    新年第一更,之前也有看过View体系系列文章,内容有点生疏了,重新温习一下,基础篇已经整理过了,接下来会重新梳理一遍关于View的整个体系的知识,权当复习了. 在Android设备上,滑动几乎是应用的 ...

  2. Android Animation动画详解(二): 组合动画特效

    前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一 ...

  3. Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法...

    在上一篇文章(Android之官方导航栏ActionBar)中,我们介绍了ActionBar各组成部分的基本应用.ActionBar除了提供Action Buttons外,还提供了多种导航方式如 Ac ...

  4. Android View系统分析之二View与ViewGroup

    目录 在Android View系统分析之从setContentView说开来(一)一文中,我们从setContentView开始阐述了Android中的视图层次,从设置内容布局到整个视图层次的建立的 ...

  5. Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)(二)

    这是Managing Device Awake State的下半篇,上半篇请看:Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)(一) 在了解接下 ...

  6. 【5年Android从零复盘系列之二十】Android自定义View(15):Matrix详解(图文)【转载】

    [转载]本文转载自麻花儿wt 的文章<android matrix 最全方法详解与进阶(完整篇)> [5年Android从零复盘系列之二十]Android自定义View(15):Matri ...

  7. [Android学习笔记二] View转化Bitmap

    在View类中的onDraw方法的参数Canvas是View绘制的背景,要将View转换为Bitmap实际上就是让Canvas上的绘制操作绘制到Bitmap上. View转化为Bitmap也称为截屏, ...

  8. Android 自定义 圆环,Android自定义View之酷炫圆环(二)

    先看下最终的效果 静态: 动态: 一.开始实现 新建一个DoughnutProgress继承View public class DoughnutProgress extends View { } 先给 ...

  9. 【朝花夕拾】Android自定义View篇之(一)View绘制流程

    前言 转载请申明转自[https://www.cnblogs.com/andy-songwei/p/10955062.html]谢谢! 自定义View.多线程.网络,被认为是Android开发者必须牢 ...

  10. android字符显示流程图,Android应用层View绘制流程与源码分析

    1  背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原 ...

最新文章

  1. 史上第一次,AI能够自学翻译地球上的任何语言了
  2. java 创建日程到期提醒_苹果“快捷指令”日程播报完美版
  3. Django中的模型继承
  4. boost::mp11::tuple_for_each相关用法的测试程序
  5. 将一个简单远程调用的方式例子改为异步调用
  6. android 获取图片像素密度,android 获取屏幕的密度和像素 点
  7. iOS-多线程 ,整理集锦,多种线程的创建
  8. 与JodaTime的DateTime和Google Guava的供应商嘲笑
  9. centos7安装DHCP服务器
  10. java仔_Java基础语法吐血整理
  11. 京东股价创新高:市值首次突破千亿美元 !
  12. u-boot移植随笔:移植过程问题及解决(本文章不时更新)
  13. Axure设计设备管理系统后台系统界面
  14. 【渝粤教育】电大中专电子商务网站建设与维护 (3)作业 题库
  15. 拓端tecdat|Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线
  16. 时域上的乘积等于频域上的卷积_图卷积神经网络:Graph Convolutional Networks
  17. gg 修改器游戏被保护_2.游戏so防封的制作思路
  18. HetConv--Heterogeneous-Kernel-Based-Convolutions-for-Deep-CNNs
  19. 蚂蚁金服自研架构 SOFA 背后的工程师|1024快乐
  20. uv纹理坐标设定与贴图规则

热门文章

  1. 浅谈分辨率对模型影响以及训练方法
  2. IROS2020 | 鲁棒全景视觉惯性导航系统ROVINS
  3. tensorflow中的优化器
  4. 第3章 java的基本程序设计结构
  5. TListView列表拒绝添加重复信息
  6. 我在项目中运用 IOC(依赖注入)--入门篇
  7. RTT distribution of Internet
  8. 【英语天天读】Albert Einstein’s Advices
  9. 【VS2010学习笔记】【编程实例】 (含有类的动态链接库的封装和调用)
  10. Python支持向量机(SVM)实例