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及子类独有的属性,可以进行各种填充效果(缩放)
属性src和background区别
最新推荐文章于 2020-10-08 20:24:11 发布