欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android源碼系列之深入理解ImageView的ScaleType屬性

 更新時(shí)間:2016年06月06日 14:21:52   作者:llew2011  
Android源碼系列第一篇,這篇文章主要從源碼的角度深入理解ImageView的ScaleType屬性,感興趣的小伙伴們可以參考一下

做Android開(kāi)發(fā)的童靴們肯定對(duì)系統(tǒng)自帶的控件使用的都非常熟悉,比如Button、TextView、ImageView等。如果你問(wèn)我具體使用,我會(huì)給說(shuō):拿ImageView來(lái)說(shuō)吧,首先創(chuàng)建一個(gè)新的項(xiàng)目,在項(xiàng)目布局文件中應(yīng)用ImageView控件,代碼如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:background="#bbaacc" > 
 
 <ImageView 
 android:src="@drawable/ic_launcher" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:background="#aabbcc" /> 
 
</LinearLayout> 

        上邊布局文件為了便于查看各種屬性效果,故意加了兩個(gè)背景顏色,這對(duì)我們今天的源碼分析影響不大。接著運(yùn)行一下代碼,效果圖如下:

        恩,不錯(cuò),運(yùn)行結(jié)果正如所愿,屏幕上顯示的正是我們?cè)O(shè)置的圖片,這時(shí)候心中不由欣喜ImageView的使用就是這樣簡(jiǎn)單,so easy嘛!呵呵,如果真是這么想那就大錯(cuò)特錯(cuò)了,上邊的示例僅僅是在布局文件中使用了ImageView的src,layout_width和layout_height這三個(gè)屬性罷了,它其他的重要屬性我們還沒(méi)有用到,今天這篇文章就是主要結(jié)合源碼講解ImageView的另一個(gè)重要的屬性------ScaleType,其他的一些屬性等將來(lái)需要的話再做詳細(xì)解說(shuō)。好了,現(xiàn)在正式進(jìn)入主題。
        ScaleType屬性主要是用來(lái)定義圖片(Bitmap)如何在ImageView中展示的,姑且就認(rèn)為是展示吧,系統(tǒng)給我們提供了8種可選屬性:matrix、fitXY、fitStart、fitCenter、fitEnd、center、centerCrop和centerInside。每一種屬性對(duì)應(yīng)的展示效果是不一樣的,下面我們先來(lái)做一個(gè)實(shí)驗(yàn)來(lái)說(shuō)明每一種屬性的顯示效果,我從之前的項(xiàng)目中挑選了兩張圖片,一張圖片的實(shí)際尺寸是720*1152,另一張是我把第一張圖翻轉(zhuǎn)放縮得到的,它的實(shí)際尺寸是96*60,之所以采用兩張圖片是為了便于對(duì)比和觀察結(jié)果,原圖片如下:

        OK,測(cè)試圖片準(zhǔn)備好了,接下來(lái)我們?cè)诓季治募蟹謩e使用ScaleType的每一個(gè)屬性值,我們開(kāi)始寫(xiě)布局文件,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:background="#bbccaa" > 
 
 <TableLayout 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:padding="10dp" > 
 
 <TextView 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:layout_marginBottom="10dp" 
 android:text="圖片尺寸的寬和高都遠(yuǎn)遠(yuǎn)大于ImageView的尺寸" /> 
 
 <TableRow 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" > 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:background="#aabbcc" 
 android:scaleType="matrix" 
 android:src="@drawable/test" /> 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:layout_marginLeft="10dp" 
 android:background="#aabbcc" 
 android:scaleType="fitXY" 
 android:src="@drawable/test" /> 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:layout_marginLeft="10dp" 
 android:background="#aabbcc" 
 android:scaleType="fitStart" 
 android:src="@drawable/test" /> 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:layout_marginLeft="10dp" 
 android:background="#aabbcc" 
 android:scaleType="fitCenter" 
 android:src="@drawable/test" /> 
 </TableRow> 
 
 <TableRow 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:layout_marginTop="5dp" > 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="matrix" /> 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="fitXY" /> 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="fitStart" /> 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="fitCenter" /> 
 </TableRow> 
 
 <TableRow 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:layout_marginTop="10dp" > 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:background="#aabbcc" 
 android:scaleType="fitEnd" 
 android:src="@drawable/test" /> 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:layout_marginLeft="10dp" 
 android:background="#aabbcc" 
 android:scaleType="center" 
 android:src="@drawable/test" /> 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:layout_marginLeft="10dp" 
 android:background="#aabbcc" 
 android:scaleType="centerCrop" 
 android:src="@drawable/test" /> 
 
 <ImageView 
 android:layout_width="300px" 
 android:layout_height="300px" 
 android:layout_marginLeft="10dp" 
 android:background="#aabbcc" 
 android:scaleType="centerInside" 
 android:src="@drawable/test" /> 
 </TableRow> 
 
 <TableRow 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:layout_marginTop="5dp" > 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="fitEnd" /> 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="center" /> 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="centerCrop" /> 
 
 <TextView 
 android:layout_width="300px" 
 android:layout_height="wrap_content" 
 android:gravity="center" 
 android:text="centerInside" /> 
 </TableRow> 
 </TableLayout> 
 
</ScrollView> 

        為了快速進(jìn)入今天文章主題,布局文件并沒(méi)有按照平時(shí)開(kāi)發(fā)中所遵循的Android開(kāi)發(fā)規(guī)范來(lái)寫(xiě)。布局中使用的是TableLayout標(biāo)簽嵌套TableRow的方式,分成兩行,每一行是4列,恰好8種屬性可以合理對(duì)比查看。當(dāng)然了這里有更高效的寫(xiě)法來(lái)實(shí)現(xiàn)同樣的效果,比如使用RelativeLayout布局等。
        在布局文件中我們定義了每個(gè)ImageView的寬高都是固定的300像素,這個(gè)尺寸遠(yuǎn)小于或者是遠(yuǎn)大于測(cè)試的圖片尺寸,另外為了便于觀察效果我給每個(gè)ImageView的背景都設(shè)置了顏色,接著運(yùn)行大圖和小圖的測(cè)試結(jié)果,效果如下:

        通過(guò)上述實(shí)驗(yàn)結(jié)果對(duì)比,就可以得出部分屬性的展示效果。比如fitXY屬性,當(dāng)ImageView的屬性設(shè)置成了fitXY時(shí),圖片的寬和高就會(huì)相應(yīng)的拉伸或者是壓縮來(lái)填充滿整個(gè)ImageView,注意這種拉放縮不成比例。當(dāng)ImageView的屬性設(shè)置成了matrix時(shí),如果圖片寬高大于ImageView的寬高時(shí),圖片的顯示就是從ImageView的左上角開(kāi)始平鋪,超出部分不再顯示;如果圖片寬高小于ImageView的寬高時(shí),圖片的顯示也是從ImageView的左上角開(kāi)始平鋪,缺少部分空白顯示出來(lái)或者是顯示ImageView的背景。以上僅僅是根據(jù)運(yùn)行結(jié)果來(lái)得出的結(jié)果,權(quán)威結(jié)論還要通過(guò)查看源碼來(lái)得出,本文分析的源碼是Android2.2版本。
        分析ImageView的源碼首先從它的構(gòu)造方法開(kāi)始,看一下構(gòu)造方法里邊都做了什么工作。構(gòu)造方法如下:

public ImageView(Context context) { 
 super(context); 
 initImageView(); 
} 
 
public ImageView(Context context, AttributeSet attrs) { 
 this(context, attrs, 0); 
} 
 
public ImageView(Context context, AttributeSet attrs, int defStyle) { 
 super(context, attrs, defStyle); 
 initImageView(); 
 
 TypedArray a = context.obtainStyledAttributes(attrs, 
 com.android.internal.R.styleable.ImageView, defStyle, 0); 
 
 Drawable d = a.getDrawable(com.android.internal.R.styleable.ImageView_src); 
 if (d != null) { 
 setImageDrawable(d); 
 } 
 
 ////////////////////////////////////////////////// 
 // 
 // 以下源碼部分屬性初始化不涉及主核心,不再貼出 
 // 
 ////////////////////////////////////////////////// 
 
 
 a.recycle(); 
 
 //need inflate syntax/reader for matrix 
} 

        通過(guò)查看構(gòu)造方法發(fā)現(xiàn),在三個(gè)構(gòu)造方法中都調(diào)用了initImageView()這個(gè)方法,這個(gè)方法是干嘛使的,我們稍后在看。其次是根據(jù)在布局文件中定義的屬性來(lái)初始化相關(guān)屬性,在測(cè)試布局中我們僅僅是用了ImageView的src,layout_width,layout_height和scaleType屬性(background屬性暫時(shí)忽略)。那也就是說(shuō)在構(gòu)造函數(shù)的初始化中就是對(duì)相關(guān)屬性進(jìn)行了賦值操作,通過(guò)解析src屬性我們獲取到了一個(gè)Drawable的實(shí)例對(duì)象d,如果d是非空的話就把d作為參數(shù)又調(diào)用了setImageDrawable(d)函數(shù),我們看看一下這個(gè)函數(shù)主要做了什么工作,源碼如下:

/** 
 * Sets a drawable as the content of this ImageView. 
 * 
 * @param drawable The drawable to set 
 */ 
public void setImageDrawable(Drawable drawable) { 
 if (mDrawable != drawable) { 
 mResource = 0; 
 mUri = null; 
 
 int oldWidth = mDrawableWidth; 
 int oldHeight = mDrawableHeight; 
 
 updateDrawable(drawable); 
 
 if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) { 
 requestLayout(); 
 } 
 invalidate(); 
 } 
} 

        此方法類型是public的,目的是干嘛使的不再解釋了,注釋上說(shuō)的是把給定的drawable作為當(dāng)前ImageView的展示內(nèi)容,接著是個(gè)條件判斷,在剛剛完成初始化的時(shí)候mDrawable屬性還沒(méi)有被賦值此時(shí)為空,因此判斷成立程序進(jìn)入條件語(yǔ)句繼續(xù)執(zhí)行,在這里把屬性mResource和mUri歸零操作并計(jì)入mDrawableWidth和mDrawableHeight的初始值,緊接著把傳遞進(jìn)來(lái)的drawable參數(shù)傳遞給了updateDrawable()方法,那我們繼續(xù)跟進(jìn)updateDrawable()看看這里邊又做了什么操作,源碼如下:

private void updateDrawable(Drawable d) { 
 if (mDrawable != null) { 
 mDrawable.setCallback(null); 
 unscheduleDrawable(mDrawable); 
 } 
 mDrawable = d; 
 if (d != null) { 
 d.setCallback(this); 
 if (d.isStateful()) { 
 d.setState(getDrawableState()); 
 } 
 d.setLevel(mLevel); 
 mDrawableWidth = d.getIntrinsicWidth(); 
 mDrawableHeight = d.getIntrinsicHeight(); 
 applyColorMod(); 
 configureBounds(); 
 } else { 
 mDrawableWidth = mDrawableHeight = -1; 
 } 
} 

        該方法首先進(jìn)行了非空判斷,此時(shí)mDrawable的值依然是空,所以條件判斷不成立跳過(guò)此部分,緊接著把傳遞進(jìn)來(lái)的非空參數(shù)d的字賦值給了屬性mDrawable,到這里mDrawable才算是完成了賦值操作。然后又進(jìn)行了條件判斷,并設(shè)置d的callback為當(dāng)前ImageView(因?yàn)镮mageView的父類View實(shí)現(xiàn)了Drawable的Callback接口)接下來(lái)又把圖片的寬和高分別賦值給了mDrawableWidth和mDrawableHeight,緊接著又調(diào)用了applyColorMod()方法,當(dāng)我們沒(méi)有給ImageView設(shè)置透明度或者是顏色過(guò)濾器時(shí)該方法不會(huì)執(zhí)行。然后調(diào)用configureBounds()方法,此方法是我們今天要講的和ScaleType屬性息息相關(guān)的重點(diǎn),不耽誤時(shí)間了趕緊瞅一下源碼吧,(*^__^*) 嘻嘻……

 private void configureBounds() { 
 if (mDrawable == null || !mHaveFrame) { 
 return; 
 } 
 
 
 int dwidth = mDrawableWidth; 
 int dheight = mDrawableHeight; 
 
 
 int vwidth = getWidth() - mPaddingLeft - mPaddingRight; 
 int vheight = getHeight() - mPaddingTop - mPaddingBottom; 
 
 
 boolean fits = (dwidth < 0 || vwidth == dwidth) && 
 (dheight < 0 || vheight == dheight); 
 
 ////////////////////////////////////////代碼塊一//////////////////////////////////////// 
 
 if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) { 
 /* If the drawable has no intrinsic size, or we're told to 
 scaletofit, then we just fill our entire view. 
 */ 
 mDrawable.setBounds(0, 0, vwidth, vheight); 
 mDrawMatrix = null; 
 
 ////////////////////////////////////////代碼塊二//////////////////////////////////////// 
 
 } else { 
 // We need to do the scaling ourself, so have the drawable 
 // use its native size. 
 mDrawable.setBounds(0, 0, dwidth, dheight); 
 
 
 if (ScaleType.MATRIX == mScaleType) { 
 // Use the specified matrix as-is. 
 if (mMatrix.isIdentity()) { 
 mDrawMatrix = null; 
 } else { 
 mDrawMatrix = mMatrix; 
 } 
 
 ////////////////////////////////////////代碼塊三//////////////////////////////////////// 
 
 } else if (fits) { 
 // The bitmap fits exactly, no transform needed. 
 mDrawMatrix = null; 
 
 ////////////////////////////////////////代碼塊四//////////////////////////////////////// 
 
 } else if (ScaleType.CENTER == mScaleType) { 
 // Center bitmap in view, no scaling. 
 mDrawMatrix = mMatrix; 
 mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f), 
  (int) ((vheight - dheight) * 0.5f + 0.5f)); 
 
 ////////////////////////////////////////代碼塊五//////////////////////////////////////// 
 
 } else if (ScaleType.CENTER_CROP == mScaleType) { 
 mDrawMatrix = mMatrix; 
 
 
 float scale; 
 float dx = 0, dy = 0; 
 
 
 if (dwidth * vheight > vwidth * dheight) { 
 scale = (float) vheight / (float) dheight; 
 dx = (vwidth - dwidth * scale) * 0.5f; 
 } else { 
 scale = (float) vwidth / (float) dwidth; 
 dy = (vheight - dheight * scale) * 0.5f; 
 } 
 
 
 mDrawMatrix.setScale(scale, scale); 
 mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f)); 
 
 ////////////////////////////////////////代碼塊六//////////////////////////////////////// 
 
 } else if (ScaleType.CENTER_INSIDE == mScaleType) { 
 mDrawMatrix = mMatrix; 
 float scale; 
 float dx; 
 float dy; 
 
 if (dwidth <= vwidth && dheight <= vheight) { 
 scale = 1.0f; 
 } else { 
 scale = Math.min((float) vwidth / (float) dwidth, 
 (float) vheight / (float) dheight); 
 } 
 
 dx = (int) ((vwidth - dwidth * scale) * 0.5f + 0.5f); 
 dy = (int) ((vheight - dheight * scale) * 0.5f + 0.5f); 
 
 
 mDrawMatrix.setScale(scale, scale); 
 mDrawMatrix.postTranslate(dx, dy); 
 
 ////////////////////////////////////////代碼塊七//////////////////////////////////////// 
 
 } else { 
 // Generate the required transform. 
 mTempSrc.set(0, 0, dwidth, dheight); 
 mTempDst.set(0, 0, vwidth, vheight); 
 
 mDrawMatrix = mMatrix; 
 mDrawMatrix.setRectToRect(mTempSrc, mTempDst, scaleTypeToScaleToFit(mScaleType)); 
 
 ////////////////////////////////////////代碼塊八//////////////////////////////////////// 
 
 } 
 } 
 } 

        configureBoundd()函數(shù)比較長(zhǎng),為了方便分析源碼,我把該函數(shù)代碼分成了8小塊,每一個(gè)小塊都是一個(gè)單獨(dú)的邏輯。每一塊的詳解如下:
代碼塊一:
        該模塊代碼首先做了一個(gè)條件判斷,如果當(dāng)前mDrawable為空或者是mHaveFrame為false則函數(shù)直接返回不再往下執(zhí)行,由于后邊的邏輯主要是根據(jù)ScaleType屬性的類型來(lái)判斷圖片的展示方式,所以再后來(lái)這個(gè)函數(shù)肯定是能往下走的通的,由于篇幅的原因不再深入講解該函數(shù)的調(diào)用時(shí)機(jī),我會(huì)在之后的文章中專門根據(jù)源碼講解一下Android系統(tǒng)下View的繪制流程,在之后的繪制流程中會(huì)提到configureBounds()的調(diào)用時(shí)機(jī)。該代碼塊的邏輯是獲取圖片的寬高存儲(chǔ)在dwidth,dheight中,然后又獲取到了ImageView的顯示圖片區(qū)域的寬高存放在vwidth和vheight中。然后定義了一個(gè)boolean類型的變量,該變量若為true就表示不需要對(duì)圖片進(jìn)行放縮處理。
代碼塊二:
        該代碼塊的邏輯是當(dāng)獲取到的圖片尺寸的寬高未知或者是ImageView的ScaleType屬性為FIT_XY時(shí),將mDrawable的顯示邊界設(shè)置成控件ImageView的顯示區(qū)域大小,并且把mDrawMatrix對(duì)象設(shè)置成null。需要說(shuō)明的是setBounds方法用來(lái)設(shè)置Drawable的繪制區(qū)域的,最終在ImageView的onDraw方法中把mDrawable表示的圖片繪制到ImageView上。
代碼塊三:
        如果圖片寬高不為0并且ImageView的ScaleType屬性不是FIT_XY時(shí),就會(huì)把mDrawable的繪制區(qū)域設(shè)置成圖片的原始大小。接著進(jìn)行判斷ImageView的ScaleType屬性值是否是MATRIX,如果是MATRIX類型,就會(huì)把當(dāng)前mMatrix賦值給mDrawMatrix。
代碼塊四:
        代碼塊四是一個(gè)if(fits)的判斷,如果fits的值為true,就表示圖片大小等于ImageView的大小,不需要對(duì)圖片進(jìn)行放縮處理了。
代碼塊五:
       當(dāng)mScaleType的類型為CENTER時(shí),實(shí)際是將圖片進(jìn)行移位操作,直接點(diǎn)說(shuō)就是把圖片的中心點(diǎn)移動(dòng)到ImageView的中心點(diǎn),如果圖片的寬高大于ImageView的寬高此時(shí)只顯示ImageView所包含的部分,大于ImageView的部分不再顯示。
      【注意:CENTER屬性只對(duì)圖片進(jìn)行移動(dòng)操作而不會(huì)進(jìn)行放縮操作】。
代碼塊六:
        代碼塊六是當(dāng)mScaleType==CENTER_CROP時(shí),進(jìn)行了一個(gè)條件判斷:if(dwidth *vheight >vwidth *dheight),看到這句代碼的時(shí)候我并沒(méi)有理解其含義,然后我把這句代碼轉(zhuǎn)換了一下寫(xiě)法:if(dwidth / vwidth > dheight / vheight),通過(guò)這種轉(zhuǎn)換寫(xiě)法然后再看就比較明白了,主要是用來(lái)判斷寬高比的,就是說(shuō)用來(lái)判斷是圖片的寬比較接近ImageView控件的寬還是圖片的高比較接近ImageView控件的高。如果是圖片的高比較接近ImageView的高,通過(guò)計(jì)算獲取需要放縮的scale的值,再計(jì)算出需要對(duì)圖片的寬進(jìn)行移動(dòng)的值,最后通過(guò)對(duì)mDrawMatrix屬性進(jìn)行設(shè)置放縮和移動(dòng)來(lái)達(dá)到控制圖片進(jìn)行放縮和移動(dòng)的效果,同樣的邏輯處理了當(dāng)圖片的寬比較接近ImageView的寬的情況。從代碼可以總結(jié)CENTER_CROP屬性的特點(diǎn)是:對(duì)圖片的寬高進(jìn)行放縮處理,使一邊達(dá)到ImageView控件的寬高,另一邊進(jìn)行進(jìn)行移動(dòng)居中顯示若超出則不再顯示。
代碼塊七:
        代碼塊七是當(dāng)mScaleType==CENTER_INSIDE時(shí),首先判斷圖片寬高是否小于ImageView寬高,如果圖片寬高小于ImageView的寬高,則scale=1.0f,也就是說(shuō)不對(duì)圖片進(jìn)行放縮處理而是直接移動(dòng)圖片進(jìn)行居中顯示,否則通過(guò)Math.min((float)vwidth / (float)dwidth, (float) vheight / (float)dheight);計(jì)算出需要對(duì)圖片進(jìn)行的放縮值,然后放縮圖片寬高并對(duì)圖片移動(dòng)居中顯示。從代碼可以總結(jié)CENTER_INSIDE的特點(diǎn)是:控制圖片尺寸,對(duì)圖片寬高進(jìn)行壓縮處理,根據(jù)圖片和控件的寬高比拿最大的一邊進(jìn)行壓縮使之同控件一邊相同,另一邊小于控件。
代碼塊八:
        代碼塊八是對(duì)mScaleType為FIT_CENTER,F(xiàn)IT_START,F(xiàn)IT_END的情況下統(tǒng)一做了處理,先設(shè)置mTempSrc和mTempDst的邊界后,通過(guò)調(diào)用mDrawMatrix的setRectToRect()方法來(lái)對(duì)圖片進(jìn)行放縮和移動(dòng)操作,使圖片最大邊始終等于ImageView相應(yīng)的邊。結(jié)合代碼和代碼測(cè)試結(jié)果可以得出如下結(jié)論:
        當(dāng)圖片的高大于寬時(shí):
1.當(dāng)mScaleType == FIT_START時(shí),對(duì)圖片進(jìn)行等比放縮,使圖片的高與ImageView的高相等,移動(dòng)圖片使之左對(duì)齊。
2.當(dāng)mScaleType == FIT_CENTER時(shí),對(duì)圖片進(jìn)行等比放縮,使圖片的高與ImageView的高相等,移動(dòng)圖片使之居中對(duì)齊。
3.當(dāng)mScaleType == FIT_END時(shí),對(duì)圖片進(jìn)行等比放縮,使圖片的高與ImageView的高相等,移動(dòng)圖片使之右對(duì)齊。
        當(dāng)圖片的寬大于高時(shí):
1.當(dāng)mScaleType == FIT_START時(shí),對(duì)圖片進(jìn)行等比放縮,使圖片的寬與ImageView的寬相等,移動(dòng)圖片使之上對(duì)齊。
2.當(dāng)mScaleType == FIT_CENTER時(shí),對(duì)圖片進(jìn)行等比放縮,使圖片的寬與ImageView的寬相等,移動(dòng)圖片使之居中對(duì)齊。
3.當(dāng)mScaleType == FIT_END時(shí),對(duì)圖片進(jìn)行等比放縮,使圖片的寬與ImageView的寬相等,移動(dòng)圖片使之下對(duì)齊。
        到這里mScaleType的8種用根據(jù)法算是分析完了,現(xiàn)在稍做總結(jié):
FIT_XY:對(duì)原圖寬高進(jìn)行放縮,該放縮不保持原比例來(lái)填充滿ImageView。
MATRIX:不改變?cè)瓐D大小從ImageView的左上角開(kāi)始繪制,超過(guò)ImageView部分不再顯示。
CENTER:對(duì)原圖居中顯示,超過(guò)ImageView部分不再顯示。
CENTER_CROP:對(duì)原圖居中顯示后進(jìn)行等比放縮處理,使原圖最小邊等于ImageView的相應(yīng)邊。
CENTER_INSIDE:若原圖寬高小于ImageView寬高,這原圖不做處理居中顯示,否則按比例放縮原圖寬(高)是之等于ImageView的寬(高)。
FIT_START:對(duì)原圖按比例放縮使之等于ImageView的寬高,若原圖高大于寬則左對(duì)齊否則上對(duì)其。
FIT_CENTER:對(duì)原圖按比例放縮使之等于ImageView的寬高使之居中顯示。
FIT_END:對(duì)原圖按比例放縮使之等于ImageView的寬高,若原圖高大于寬則右對(duì)齊否則下對(duì)其。
        還記得在博文開(kāi)始的時(shí)候說(shuō)到在ImageView的構(gòu)造方法中都調(diào)用了initImageView()方法么?他的源碼如下:

private void initImageView() { 
 mMatrix = new Matrix(); 
 mScaleType = ScaleType.FIT_CENTER; 
} 

        可以看到,當(dāng)我們沒(méi)有在布局文件中使用scaleType屬性或者是沒(méi)有手動(dòng)調(diào)用setScaleType方法時(shí),那么mScaleType的默認(rèn)值就是FIT_CENTER。
        好了,有關(guān)ImageView的ScaleType的講解就算結(jié)束了,如有錯(cuò)誤歡迎指正。以后如有其它屬性需要詳解,再做記錄吧。

原文地址:http://blog.csdn.net/llew2011/article/details/50855655

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論