1.ImageView的ScaleType
ImageView是Android中的基礎圖片顯示控件,該控件有個重要的屬性ScaleType,這個屬性在一定程度上可以控制圖片顯示的縮放。Launcher中AppWidget的preview顯示是通過ImageView顯示,而且每個AppWidget的preview大小可能不一樣,而給定的顯示區域大小是一樣的,故通過ScaleType屬性來控制preview的顯示。Imageview的ScaleType共有8種取值:
(1) ScaleType.CENTER:圖片大小爲原始大小,如果圖片大小大於ImageView控件,則截取圖片的中間部分,若小於,則直接將圖片居中顯示。
(2) ScaleType.CENTER_CROP:將圖片等比例縮放,讓圖像的短邊與ImageView的邊長相同,即不能留有空白,縮放後截取中間部分進行顯示。
(3) ScaleType.CENTER_INSIDE:將圖片大小大於ImageView的圖片進行等比例縮小,直到整幅圖能夠居中顯示在ImageView中,小雨ImageView的圖片不變,直接居中顯示。
(4) ScaleType.FIT_CENTER:ImageView的默認狀態,大圖等比例縮小,使整幅圖能夠居中顯示在ImageView中,小圖等比例放大,同樣要整體居中顯示在ImageView中。
(5) ScaleType.FIT_END:縮放方式同FIT_CENTER,只是將圖片顯示在右方或下方,而不是居中。
(6) ScaleType.FIT_START:縮放方式同FIT_CENTER,只是將圖片顯示在左方或上方,而不是居中。
(7) ScaleType.FIT_XY:將圖片非等比例縮放到大小與ImageView相同。
(8) ScaleType.MATRIX:是根據一個3x3的矩陣對其中圖片進行縮放。
Launcher中ImageView的默認ScaleType值爲ScaleType.MATRIX,當圖片的尺寸過大時就將ScaleType的值設爲ScaleType.FIT_START。
2.Matrix
線性代數中有關矩陣的乘法運算運用到Android中,來實現圖像的平移,縮放,旋轉等操縱,其相關類爲android.graphics.Matrix。
(1)首先,舉個簡單的例子:設點p0(x0,y0)進行平移後,移到p(x,y),其中x方向的平移量爲△x,y方向的平移量爲△y,那麼,點p(x,y)的座標爲:
x=x0+△x
y=y0+△y
採用矩陣表達上述關係如下:
上述也類似於圖像的平移,通過上述矩陣發現,只需要改變矩陣右上角的兩個元素就可以實現平移了。
代碼實現爲:
float a=10f;
float b=10f;
Matrix matrix=new Matrix();
matrix.setTranslate(a, b);
亦可以通過設置矩陣的值來實現平移:
float f[]={1f,0f,10.0f,0f,1f,10.0f,0f,0f,1f};
Matrix matrix=new Matrix();
Matrix.setValues(f);
(2)舉個具體的例子,來實現縮放功能:設點p0(x0,y0),放大後變爲p(x,y)其中x放大a倍,y方法b倍
x=a*x0;
y=b*y0;
採用矩陣的表達上述結果爲:
float a=10f;
float b=10f;
Matrix matrix=new Matrix();
matrix.setScale(a, b);
亦可以通過設置矩陣的值來實現平移:
float f[]={10.0f,0f,0.0f ,0f, 10.0f,0.0f,0f,0f,1f};
Matrix matrix=new Matrix();
Matrix.setValues(f);
(3)實現旋轉的功能:設點爲p(x0,y0)旋轉θ角後的對應點爲p(x,y)。通過使用向量,得到如下:
x0=r*cosα
y0=r*sinα
x=r*cos(α+θ)= x0cosθ - y0 sinθ
y=r sin(α+θ)= x0 sinθ + y0 cosθ
得到矩陣如下:
代碼設置爲:
float a=30.0f;
Matrix matrix=new Matrix();
matrix.setRotate(a);
其中這是按照原點旋轉的。如果按照某一個點旋轉如下:
matrix.setRotate(a,x,y);
在實現圖像的上述功能中,Matrix與Bitmap結合使用,如下
floatf[]={1f,0f,10.0f,0f,1f,10.0f,0f,0f,1f};
Matrix matrix=new Matrix();
Matrix.setValues(f);
Bitmap bm2=Bitmap.createBitmap(bm1,0,0,width,height,matrix,true);
3.Canvas、Bitmap、Drawable
首先,先介紹Canvas,Bitmap,Drawable:
Canvas:名爲畫布,可以看做是一種處理過程,使用各種方法來管理Bitmap、GL或者path路徑,同時它可以配合Matrix矩陣類給圖像做旋轉、縮放等操作,同時canvas類還提供了裁剪、選取等操作。
Bitmap:稱爲位圖,一般位圖的文件格式後綴爲bmp,是android系統中和的圖像處理的最重要的類之一。用它可以火族圖像文件的信息,進行圖像的裁剪、選裝錯放等操作,並可以指定格式保存圖像文件。
Drawable:它是一個通用的抽象類,它的目標是告訴你什麼東西可以畫的。基於Drawable類擴展出各種繪圖類,也可以繼承它來創建自己的繪圖類,Launcher中FastBitmapDrawable就是這樣的。介紹兩種方式創建Drawable:從資源圖像文件中創建,從XML文件中創建。
Canvas,Bitmap和Drawable在Launcher中結合使用,來實現圖像的縮放如下:
Canvas canvas=new Canvas();
Bitmap orig=……;//目標bitmap
int w=orig,getWidth();
int h=orig.getHeight();
Bitmapb=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
Canvas.setBitmap(b);
Rect src=new Rect(0,0,w,h);//源矩形
float scale=0.5f;
Rect dst=new Rect(0,0,(int)(w*scale),(int)(h*scale));//目標矩形
Canvas.drawBitmap(orig,src.dst,null);
顯示的圖像經過變換後,經過源矩形與目標矩形的設置來控制縮放。
Drawable d=……;
Canvas c=new Canvas(bitmap);
c.scale(scale,scasle);//設置縮放比例
Rect oldBounds=d.copyBounds();
d.setBounds(x.y,x+w,y+h);
d.draw(c);
d.setBounds(oldBounds);
經過Canvas設置縮放比例,來直接控制縮放。