属性src和background区别

来源:互联网 发布:软件开发经费预算 编辑:程序博客网 时间:2024/06/05 11:11

src一般只有ImageView才有这个属性一、View的background属性分析首先分析View的draw过程    // View.java    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;        /*         *<span style="white-space:pre"></span>     主要绘制以下四部分内容         *      1. Draw the background 画背景background.draw         *               *      3. Draw view's content<span style="white-space:pre"></span>绘制自己onDraw         *      4. Draw children<span style="white-space:pre"></span>绘制children  despatchDraw         *               *      6. Draw decorations (scrollbars for instance)  绘制装饰onDrawScrollBArs         */        // Step 1, draw the background, if needed        int saveCount;        if (!dirtyOpaque) {    <span style="white-space:pre"></span>// 1.画背景            drawBackground(canvas);        }        // ...    }        private void drawBackground(Canvas canvas) {            final Drawable background = mBackground;            if (background == null) {                return;            }            mBackground.setBounds(0, 0,  mRight - mLeft, mBottom - mTop);            final int scrollX = mScrollX;            final int scrollY = mScrollY;            if ((scrollX | scrollY) == 0) {                background.draw(canvas); // 根据setBounds的范围画background的图片            } else {                canvas.translate(scrollX, scrollY);                background.draw(canvas);                canvas.translate(-scrollX, -scrollY);            }        }总结:background默认是把图片全屏画在View上,并不做缩放等处理二、ImageView的src属性分析    使用:        <ImageView            android:id="@+id/imageview"            android:scaleType="centerCrop"<span style="white-space:pre"></span>            android:src="@drawable/parallax_img"            android:layout_width="match_parent"            android:layout_height="100dp"/>    源码:        ImageView的构造函数中解析scaleType           setScaleType(sScaleTypeArray[index]);  // mScaleType = scaleType; 不同的ScaleType对应不同的缩放类型    <span style="white-space:pre"></span>之后根据mScaleType转化成对应的Matrix(mDrawMatrix),之后onDraw就能使用缩放后的ImageView        ImageView的onDraw方法        protected void onDraw(Canvas canvas) {            super.onDraw(canvas);<span style="white-space:pre"></span>// 上述View的四个步骤                      // 如果有设置scaleType则mDrawMatrix就有值            if (mDrawMatrix == null && mPaddingTop == 0 && mPaddingLeft == 0) {                mDrawable.draw(canvas);            } else {    // 根据matrix进行对应的图像的缩放                int saveCount = canvas.getSaveCount();                canvas.save();                                if (mCropToPadding) {                    final int scrollX = mScrollX;                    final int scrollY = mScrollY;                    canvas.clipRect(scrollX + mPaddingLeft, scrollY + mPaddingTop,                            scrollX + mRight - mLeft - mPaddingRight,                            scrollY + mBottom - mTop - mPaddingBottom);                }                                canvas.translate(mPaddingLeft, mPaddingTop);                if (mDrawMatrix != null) {                    canvas.concat(mDrawMatrix);                }                mDrawable.draw(canvas);                canvas.restoreToCount(saveCount);            }        }    总结:src可以使用scaleType进行多种缩放(对图片),以此来适配各种不同的View三、总结    backGround是各种View都具有的属性,默认只能填充整个view,作为背景    src是ImageView及子类独有的属性,可以进行各种填充效果(缩放)

1 0