Android源码用到的Flag设置标志位机制

本文以View的setFlag方法为例,探讨Android源码中如何利用Flag进行状态管理。当View设置为gone时,系统会通过Flag调整绘制逻辑。这种机制确保了不同状态之间的逻辑互不干扰。
摘要由CSDN通过智能技术生成
日常编码中我们设置状态,如果是一种情形的两种状态,可以用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

现在以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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值