通過前一篇的學習,對Android 畫圖核心部分有了一定的了解,後面篇幅,我們将詳細介紹Android中的各種畫圖對象的使用,首先介紹我們最常用的Bitmap(位圖)。位圖是我們開發中最常用的資源,畢竟一個漂亮的界面對使用者是最有吸引力的。按照對位圖的操作,分為以下幾個功能分别介紹:
- 從資源中擷取位圖
- 擷取位圖的資訊
- 顯示位圖
- 位圖縮放
- 位圖旋轉
1. 從資源中擷取位圖
在前一篇幅介紹了:先擷取Resource,然後可以通過資源ID擷取Drawable,也可以通過資源ID擷取資源檔案的資料流。使用第一種方法比較容易,下面詳細說明第二種方法。通過Resource的函數:InputStream openRawResource(int id)擷取得到資源檔案的資料流後,也可以通過2種方法來擷取Bitmap,如下:
使用BitmapDrawable (A Drawable that wraps a bitmap and can be tiled, stretched, or aligned.) |
|
使用BitmapFactory (Creates Bitmap objects from various sources, including files, streams, and byte-arrays.) |
|
以上方法在程式設計的時候可以自由選擇,在Android SDK中說明可以支援的圖檔格式如下:png (preferred), jpg (acceptable), gif (discouraged),雖然bmp格式沒有明确說明,但是在Android SDK Support Media Format中是明确說明了。
2. 擷取位圖的資訊
要擷取位圖資訊,比如位圖大小、是否包含透明度、顔色格式等,擷取得到Bitmap就迎刃而解了,這些資訊在Bitmap的函數中可以輕松擷取到。Android SDK中對Bitmap有詳細說明,閱讀起來也比較容易,不在此詳細說明,這裡隻是輔助說明以下2點:
- 在Bitmap中對RGB顔色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發中可能需要注意這個小問題;
- Bitmap還提供了compress()接口來壓縮圖檔,不過AndroidSAK隻支援PNG、JPG格式的壓縮;其他格式的需要Android開發人員自己補充了。
3. 顯示位圖
顯示位圖需要使用核心類Canvas,可以直接通過Canvas類的drawBirmap()顯示位圖,或者借助于BitmapDrawable來将Bitmap繪制到Canvas。具體如何顯示位圖不是主要的問題,主要問題是如何擷取Canvas,參考Snake中的方法,做了個簡單的例子testView,提供給大家下載下傳。
testView例子介紹:其包含2個類testActivity,testView;testActivity繼承與Activity,testView繼承與View。這個例子就是将testView直接作為testActivity的視窗,這樣我們就可以直接在testView畫圖了。具體如何實作的,請大家參考testActivity的onCreate()中的代碼,以及layout/main.xml中的設定。在testView的onDraw()直接畫圖,結果在例子程式運作後就可以直接在界面上顯示了。
4. 位圖縮放
位圖的縮放,在Android SDK中提供了2種方法:
-
将一個位圖按照需求重畫一遍,畫後的位圖就是我們需要的了,與位圖的顯示幾乎一樣:
drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
-
在原有位圖的基礎上,縮放原位圖,建立一個新的位圖:
createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
第2種方法一看就明白,對于第一種方法,舉個簡單的例子來說明:
int w = 320,h = 240;
String mstrTitle = “感受Android帶給我們的新體驗”;
Bitmap mbmpTest = Bitmap.createBitmap(w,h, Config.ARGB_8888);
Canvas canvasTemp = new Canvas(mbmpTest);
canvasTemp.drawColor(Color.WHITE);
Paint p = new Paint();
String familyName = “宋體”;
Typeface font = Typeface.create(familyName,Typeface.BOLD);
p.setColor(Color.RED);
p.setTypeface(font);
p.setTextSize(22);
canvasTemp.drawText(mstrTitle,0,100,p);
顯示位圖mbmpTest,就會發現一張320×240、白色背景、紅色“宋體”文字的圖檔,如下:

這個例子沒有位圖縮放的任何操作?的确,但是這是我在想如何寫個簡單的位圖縮放的小程式時,最先想到的。看完這個例子,我想你就應該明白如何實作位圖的縮放了。不要小瞧了這個例子,雖然與位圖縮放關系不大,但是卻可以讓你了解位圖縮放的本質:将原始位圖按照需求顯示出來,就創造了一張新的位圖。
5. 位圖旋轉
位圖的旋轉,離不開Matrix。Matrix線上性代數中都學習過,Android SDK提供了Matrix類,可以通過各種接口來設定矩陣。結合上面的例子程式,将位圖縮放例子程式在顯示位圖的時候前,增加位圖旋轉功能,修改代碼如下:
Matrix matrix = new Matrix();
//matrix.postScale(0.5f, 0.5f);
matrix.setRotate(90,120,130);
canvas.drawBitmap(mbmpTest, matrix, mPaint);
旋轉後的位圖顯示如下:
除了這種方法之外,我們也可以在使用Bitmap提供的函數如下:
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter),在原有位圖旋轉的基礎上,建立新位圖。
總結說明
對位圖的操作,結合Android SDK中的類,詳細的介紹完了。最後還需要強調的是:這篇文章隻是對Android SDK中代碼閱讀分析,它代替不了你閱讀Android SDK,深入的學習還是要仔細的閱讀Android SDK。