属性src和background区别

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及子类独有的属性,可以进行各种填充效果(缩放)














  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值