不要使用Drawable的setBounds方法來指定其在控制元件作為背景的顯示位置
阿新 • • 發佈:2019-01-30
假設一個控制元件使用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; }....