日常编码中我们设置状态,如果是一种情形的两种状态,可以用0或者1来区分,如果是多种情形每种情形还有多个状态,我们可以利用android这套设置标志位机制,它的原理就是利用int不同位表示不同的情形,再利用这些位所包含的二进制数来代表不同的状态,这样我们就可以用一个int类型变量来表示所有的状态了。
在分析之前先补习一下位运算符:
& 与:11为1,就是当两者都为1时才为1。 例:1100 & 1001 = 1000
| 或:两者有一个为1结果就为1. 例:1100 | 1001 = 1101
~ 非:1变0,0变1 例:~1100 = 0011
^ 异或:左右位相同时为0,不同时为1. 例:1100 ^ 1001 = 0101
在分析之前先补习一下位运算符:
& 与:11为1,就是当两者都为1时才为1。 例:1100 & 1001 = 1000
| 或:两者有一个为1结果就为1. 例:1100 | 1001 = 1101
~ 非:1变0,0变1 例:~1100 = 0011
^ 异或:左右位相同时为0,不同时为1. 例:1100 ^ 1001 = 0101
现在以View中setFlag方法为例说明这种标志机制。
void setFlags(int flags, int mask) {
... ...
int old = mViewFlags;
mViewFlags = (mViewFlags & ~mask) | (flags & mask);
int changed = mViewFlags ^ old;
if (changed == 0) {
return;
}
... ...
final int newVisibility = flags & VISIBILITY_MASK;
if (newVisibility == VISIBLE) {
if ((changed & VISIBILITY_MASK) != 0) {
/*
* If this view is becoming visible, invalidate it in case it changed while
* it was not visible. Marking it drawn ensures that the invalidation will
* go through.
*/
mPrivateFlags |= PFLAG_DRAWN;
invalidate(true);
needGlobalAttributesUpdate(true);
// a view becoming visible is worth notifying the parent
// about in case nothing has focus. even if this specific view
// isn't focusable, it may contain something that is, so let
// the root view try to give this focus if nothing else does.
if ((mParent != null) && (mBottom > mTop) && (mRight > mLeft)) {
mParent.focusable