亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

做Android開發(fā)的童靴們肯定對系統(tǒng)自帶的控件使用的都非常熟悉,比如Button、TextView、ImageView等。如果你問我具體使用,我會給說:拿ImageView來說吧,首先創(chuà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> 

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

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

        OK,測試圖片準(zhǔn)備好了,接下來我們在布局文件中分別使用ScaleType的每一個屬性值,我們開始寫布局文件,內(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="圖片尺寸的寬和高都遠遠大于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> 

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

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

        通過查看構(gòu)造方法發(fā)現(xiàn),在三個構(gòu)造方法中都調(diào)用了initImageView()這個方法,這個方法是干嘛使的,我們稍后在看。其次是根據(jù)在布局文件中定義的屬性來初始化相關(guān)屬性,在測試布局中我們僅僅是用了ImageView的src,layout_width,layout_height和scaleType屬性(background屬性暫時忽略)。那也就是說在構(gòu)造函數(shù)的初始化中就是對相關(guān)屬性進行了賦值操作,通過解析src屬性我們獲取到了一個Drawable的實例對象d,如果d是非空的話就把d作為參數(shù)又調(diào)用了setImageDrawable(d)函數(shù),我們看看一下這個函數(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的,目的是干嘛使的不再解釋了,注釋上說的是把給定的drawable作為當(dāng)前ImageView的展示內(nèi)容,接著是個條件判斷,在剛剛完成初始化的時候mDrawable屬性還沒有被賦值此時為空,因此判斷成立程序進入條件語句繼續(xù)執(zhí)行,在這里把屬性mResource和mUri歸零操作并計入mDrawableWidth和mDrawableHeight的初始值,緊接著把傳遞進來的drawable參數(shù)傳遞給了updateDrawable()方法,那我們繼續(xù)跟進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; 
 } 
} 

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

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

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

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

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

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

相關(guān)文章

最新評論