android view state,Android状态系统(二)——View状态组合
上一讲我们介绍了安卓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状态组合相关推荐
- View的事件体系之二 View的滑动以及弹性滑动
新年第一更,之前也有看过View体系系列文章,内容有点生疏了,重新温习一下,基础篇已经整理过了,接下来会重新梳理一遍关于View的整个体系的知识,权当复习了. 在Android设备上,滑动几乎是应用的 ...
- Android Animation动画详解(二): 组合动画特效
前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一 ...
- Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法...
在上一篇文章(Android之官方导航栏ActionBar)中,我们介绍了ActionBar各组成部分的基本应用.ActionBar除了提供Action Buttons外,还提供了多种导航方式如 Ac ...
- Android View系统分析之二View与ViewGroup
目录 在Android View系统分析之从setContentView说开来(一)一文中,我们从setContentView开始阐述了Android中的视图层次,从设置内容布局到整个视图层次的建立的 ...
- Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)(二)
这是Managing Device Awake State的下半篇,上半篇请看:Android官方文章翻译之管理设备苏醒状态(Managing Device Awake State)(一) 在了解接下 ...
- 【5年Android从零复盘系列之二十】Android自定义View(15):Matrix详解(图文)【转载】
[转载]本文转载自麻花儿wt 的文章<android matrix 最全方法详解与进阶(完整篇)> [5年Android从零复盘系列之二十]Android自定义View(15):Matri ...
- [Android学习笔记二] View转化Bitmap
在View类中的onDraw方法的参数Canvas是View绘制的背景,要将View转换为Bitmap实际上就是让Canvas上的绘制操作绘制到Bitmap上. View转化为Bitmap也称为截屏, ...
- Android 自定义 圆环,Android自定义View之酷炫圆环(二)
先看下最终的效果 静态: 动态: 一.开始实现 新建一个DoughnutProgress继承View public class DoughnutProgress extends View { } 先给 ...
- 【朝花夕拾】Android自定义View篇之(一)View绘制流程
前言 转载请申明转自[https://www.cnblogs.com/andy-songwei/p/10955062.html]谢谢! 自定义View.多线程.网络,被认为是Android开发者必须牢 ...
- android字符显示流程图,Android应用层View绘制流程与源码分析
1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原 ...
最新文章
- 史上第一次,AI能够自学翻译地球上的任何语言了
- java 创建日程到期提醒_苹果“快捷指令”日程播报完美版
- Django中的模型继承
- boost::mp11::tuple_for_each相关用法的测试程序
- 将一个简单远程调用的方式例子改为异步调用
- android 获取图片像素密度,android 获取屏幕的密度和像素 点
- iOS-多线程 ,整理集锦,多种线程的创建
- 与JodaTime的DateTime和Google Guava的供应商嘲笑
- centos7安装DHCP服务器
- java仔_Java基础语法吐血整理
- 京东股价创新高:市值首次突破千亿美元 !
- u-boot移植随笔:移植过程问题及解决(本文章不时更新)
- Axure设计设备管理系统后台系统界面
- 【渝粤教育】电大中专电子商务网站建设与维护 (3)作业 题库
- 拓端tecdat|Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线
- 时域上的乘积等于频域上的卷积_图卷积神经网络:Graph Convolutional Networks
- gg 修改器游戏被保护_2.游戏so防封的制作思路
- HetConv--Heterogeneous-Kernel-Based-Convolutions-for-Deep-CNNs
- 蚂蚁金服自研架构 SOFA 背后的工程师|1024快乐
- uv纹理坐标设定与贴图规则