1. 程式人生 > >不要使用Drawable的setBounds方法來指定其在控制元件作為背景的顯示位置

不要使用Drawable的setBounds方法來指定其在控制元件作為背景的顯示位置

假設一個控制元件使用Drawable作為背景,那麼如果你想通過setBounds方法來控制背景的顯示區域,那麼你達不到目的.

原因是 當drawable被設定成控制元件背景後,當這個控制元件被繪製時(也就是draw(canvas)被呼叫時),控制元件在繪製背景時會自動更改其bounds為控制元件大小.

所以無論你怎麼設定,系統都會在繪製這個控制元件背景時將其Bounds改為控制元件大小.

附上原始碼

public void draw(Canvas canvas) {
        final int privateFlags = mPrivateFlags;
        final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE &&
                (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);
        mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN;

        /*
         * Draw traversal performs several drawing steps which must be executed
         * in the appropriate order:
         *
         *      1. Draw the background
         *      2. If necessary, save the canvas' layers to prepare for fading
         *      3. Draw view's content
         *      4. Draw children
         *      5. If necessary, draw the fading edges and restore layers
         *      6. Draw decorations (scrollbars for instance)
         */

        // Step 1, draw the background, if needed
        int saveCount;

        if (!dirtyOpaque) {
            <strong>drawBackground(canvas);</strong>
        }....
private void drawBackground(Canvas canvas) {
        final Drawable background = mBackground;
        if (background == null) {
            return;
        }

        if (mBackgroundSizeChanged) {
            <strong>background.setBounds(0, 0,  mRight - mLeft, mBottom - mTop);</strong>
            mBackgroundSizeChanged = false;
            mPrivateFlags3 |= PFLAG3_OUTLINE_INVALID;
        }....