is there any diff @null Vs #00000000

后端 未结 4 1077
野性不改
野性不改 2021-01-07 20:06

Is there any difference between @null Vs transparent(#00000000)

in my layout I set android:background\"@color/transparent\" but its showing some other

相关标签:
4条回答
  • 2021-01-07 20:24

    Yes, there is.

    • @null means no background.
    • #00000000 means add a transparent background.

    If you will not have a background make it @null it should perform better. To use @null from the code you can try doing:

    widget.setBackgroundDrawable(null);
    
    0 讨论(0)
  • 2021-01-07 20:36

    set 0 in background.

    view.setBackgroundColor(0);
    
    0 讨论(0)
  • 2021-01-07 20:37

    I would say, in most circumstances prefer @null background over @android:color/transparent.

    In code, use setBackground(null) which calls a deprecated method setBackgroundDrawable();

    If you look at the View.setBackgroundDrawable(), you will notice that if you pass null as background it will set the flags to SKIP_DRAW and that's it. On other hand, if there is a drawable object, it will go through extra process to set up background padding.

    Here is the code of setBackgroundDrawable (Note: use setBackground instead of setBackgroundDrawable)

       public void setBackgroundDrawable(Drawable background) {
        computeOpaqueFlags();
    
        if (background == mBackground) {
            return;
        }
    
        boolean requestLayout = false;
    
        mBackgroundResource = 0;
    
        /*
         * Regardless of whether we're setting a new background or not, we want
         * to clear the previous drawable.
         */
        if (mBackground != null) {
            mBackground.setCallback(null);
            unscheduleDrawable(mBackground);
        }
    
        if (background != null) {
            Rect padding = sThreadLocal.get();
            if (padding == null) {
                padding = new Rect();
                sThreadLocal.set(padding);
            }
            resetResolvedDrawables();
            background.setLayoutDirection(getLayoutDirection());
            if (background.getPadding(padding)) {
                resetResolvedPadding();
                switch (background.getLayoutDirection()) {
                    case LAYOUT_DIRECTION_RTL:
                        mUserPaddingLeftInitial = padding.right;
                        mUserPaddingRightInitial = padding.left;
                        internalSetPadding(padding.right, padding.top, padding.left, padding.bottom);
                        break;
                    case LAYOUT_DIRECTION_LTR:
                    default:
                        mUserPaddingLeftInitial = padding.left;
                        mUserPaddingRightInitial = padding.right;
                        internalSetPadding(padding.left, padding.top, padding.right, padding.bottom);
                }
                mLeftPaddingDefined = false;
                mRightPaddingDefined = false;
            }
    
            // Compare the minimum sizes of the old Drawable and the new.  If there isn't an old or
            // if it has a different minimum size, we should layout again
            if (mBackground == null || mBackground.getMinimumHeight() != background.getMinimumHeight() ||
                    mBackground.getMinimumWidth() != background.getMinimumWidth()) {
                requestLayout = true;
            }
    
            background.setCallback(this);
            if (background.isStateful()) {
                background.setState(getDrawableState());
            }
            background.setVisible(getVisibility() == VISIBLE, false);
            mBackground = background;
    
            if ((mPrivateFlags & PFLAG_SKIP_DRAW) != 0) {
                mPrivateFlags &= ~PFLAG_SKIP_DRAW;
                mPrivateFlags |= PFLAG_ONLY_DRAWS_BACKGROUND;
                requestLayout = true;
            }
        } else {
            /* Remove the background */
            mBackground = null;
    
            if ((mPrivateFlags & PFLAG_ONLY_DRAWS_BACKGROUND) != 0) {
                /*
                 * This view ONLY drew the background before and we're removing
                 * the background, so now it won't draw anything
                 * (hence we SKIP_DRAW)
                 */
                mPrivateFlags &= ~PFLAG_ONLY_DRAWS_BACKGROUND;
                mPrivateFlags |= PFLAG_SKIP_DRAW;
            }
    
            /*
             * When the background is set, we try to apply its padding to this
             * View. When the background is removed, we don't touch this View's
             * padding. This is noted in the Javadocs. Hence, we don't need to
             * requestLayout(), the invalidate() below is sufficient.
             */
    
            // The old background's minimum size could have affected this
            // View's layout, so let's requestLayout
            requestLayout = true;
        }
    
        computeOpaqueFlags();
    
        if (requestLayout) {
            requestLayout();
        }
    
        mBackgroundSizeChanged = true;
        invalidate(true);
    }
    
    0 讨论(0)
  • 2021-01-07 20:39

    @null means no background at all (View.getBackground() returns null).

    #00000000 means that you got a ColorDrawable as the background which has a fully-transparent color.

    I didn't look at the code, but I guess that the framework tests if the ColorDrawable is fully transparent and does not draw it in this case. Otherwise you would have some drawing overhead, making @null the faster choice. Both should look identical, so not sure if this is your underlying isse.

    To set the equivalent of @null in code, use View.setBackgroundDrawable(null).

    0 讨论(0)
提交回复
热议问题