Android開發(fā)者學(xué)習(xí)筆記——View、Canvas、bitmap_第1頁
Android開發(fā)者學(xué)習(xí)筆記——View、Canvas、bitmap_第2頁
Android開發(fā)者學(xué)習(xí)筆記——View、Canvas、bitmap_第3頁
Android開發(fā)者學(xué)習(xí)筆記——View、Canvas、bitmap_第4頁
Android開發(fā)者學(xué)習(xí)筆記——View、Canvas、bitmap_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、開發(fā)者學(xué)習(xí)筆記 View&CanvasBitMap 、View 以及 Canvas 是我們 Ophone 程序中常用到的類。 本日以 feisky 的學(xué)習(xí)筆 記呈現(xiàn),通過實例講解 View&Canvas 等等。1. 從資源中獲取位圖可以使用 BitmapDrawable 或者 BitmapFactory 來獲取資源中的位圖。當(dāng)然,首先需要獲取資源:Resources res=getResources();使用 BitmapDrawable 獲取位圖使用 BitmapDrawable (InputStream is) 構(gòu)造一個 BitmapDrawable ;使用 BitmapD

2、rawable 類的 getBitmap() 獲取得到位圖;/ 讀取 InputStream 并得到位圖InputStream is=res.openRawResource(R.drawable.pic180);BitmapDrawable bmpDraw=new BitmapDrawable(is);Bitmap bmp=bmpDraw.getBitmap();或者采用下面的方式:BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);Bitmap bmp=bmpDraw.getBitmap();使用

3、 BitmapFactory 獲取位圖( Creates Bitmap objects from various sources, including files, streams, and byte-arrays. )使用 BitmapFactory 類 decodeStream(InputStream is) 解碼位圖資源,獲取位圖。 Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);BitmapFactory 的所有函數(shù)都是 static ,這個輔助類可以通過資源 ID 、路徑、文件、數(shù)據(jù) 流等方式來獲取位圖。

4、以上方法在編程的時候可以自由選擇,在 Android SDK 中說明可以支持的圖片格式如下: png (preferred), jpg (acceptable), gif (discouraged),和 bmp ( Android SDKSupport Media Format )。2. 獲取位圖的信息要獲取位圖信息, 比如位圖大小、 像素、 density 、透明度、 顏色格式等, 獲取得到 Bitmap 就迎刃而解了,這些信息在 Bitmap 的手冊中,這里只是輔助說明以下 2 點:在 Bitmap 中對 RGB 顏色格式使用 Bitmap.Config 定義,僅包括 ALPHA_8 、

5、ARGB_4444 、 ARGB_8888 、RGB_565 ,缺少了一些其他的,比如說 RGB_555 ,在開 發(fā)中可能需要注意這個小問題;Bitmap 還提供了 compress() 接口來壓縮圖片,不過 AndroidSAK 只支持 PNG 、JPG 格 式的壓縮;其他格式的需要 Android 開發(fā)人員自己補充了。3. 顯示位圖顯示位圖可以使用核心類 Canvas ,通過 Canvas 類的 drawBirmap() 顯示位圖,或者借 助于 BitmapDrawable 來將 Bitmap 繪制到 Canvas 。當(dāng)然,也可以通過 BitmapDrawable 將位圖顯示到 View

6、中。轉(zhuǎn)換為 BitmapDrawable 對象顯示位圖/ 獲取位圖Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);/ 轉(zhuǎn)換為 BitmapDrawable 對象BitmapDrawable bmpDraw=new BitmapDrawable(bmp);/ 顯示位圖ImageView iv2 = (ImageView)findViewById(R.id.ImageView02); iv2.setImageDrawable(bmpDraw);使用 Canvas 類顯示位圖這兒采用一個繼承自 View 的子類 Pane

7、l ,在子類的 OnDraw 中顯示public class MainActivity extends Activity /* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(new Panel(this);class Panel extends Viewpublic Panel(Context context) super(context);

8、public void onDraw(Canvas canvas)Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.pic180);canvas.drawColor(Color.BLACK);canvas.drawBitmap(bmp, 10, 10, null);4. 位圖縮放(1 )將一個位圖按照需求重畫一遍,畫后的位圖就是我們需要的了,與位圖的顯示幾乎一 樣: drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)。(2 )在原有位圖的基礎(chǔ)上

9、,縮放原位圖,創(chuàng)建一個新的位圖:CreateBitmap(Bitmapsource, int x, int y, int width, int height, Matrix m, boolean filter)( 3 )借助 Canvas 的 scale(float sx, float sy)( Preconcat the current matrix withthe specified scale. ),不過要注意此時整個畫布都縮放了。( 4 )借助 Matrix :Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.dra

10、wable.pic180);Matrix matrix=new Matrix();matrix.postScale(0.2f, 0.2f);Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true);canvas.drawColor(Color.BLACK);canvas.drawBitmap(dstbmp, 10, 10, null);5. 位圖旋轉(zhuǎn)R.drawable.p同樣,位圖的旋轉(zhuǎn)也可以借助Matrix或者Canvas來實現(xiàn)。Bitmap bmp = BitmapFact

11、ory.decodeResource(getResources(), ic180);Matrix matrix =newMatrix();matrix.postScale(0.8f,0.8f);matrix.postRotate(45);Bitmap dstbmp=Bitmap.createBitmap(bmp,O,O,bmp.getWidth(), bmp.getHeight(),matrix,true);can vas.drawColor(Color.BLACK);can vas.drawBitmap(dstbmp,10, 10, nu II);旋轉(zhuǎn)效果:6.圖片水印的生成方法生成水印的過

12、程。其實分為三個環(huán)節(jié):第一,載入原始圖片;第二,載入水印圖片; 保存新的圖片。* create the bitmap from a byte array* param src the bitmap object you want proecss* param watermark the water mark above the src* return return a bitmap object ,if paramter's length is 0,return null */private Bitmap createBitmap( Bitmap src, Bitmap waterma

13、rk )String tag = "createBitmap"Log.d( tag, "create a new bitmap" );if( src = null )return null;int w = src.getWidth();int h = src.getHeight();int ww = watermark.getWidth();int wh = watermark.getHeight();/create the new blank bitmapBitmap newb = Bitmap.createBitmap( w, h, Config.A

14、RGB_8888 );/ 的和 SRC 長度寬度一樣的位圖Canvas cv = new Canvas( newb );/draw src into cv.drawBitmap( src, 0, 0, null );/在/draw watermark intocv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );/ 水印/save all clipcv.save( Canvas.ALL_SAVE_FLAG );/ 保存/storecv.restore();/ 存儲return newb;6. 圖片水印的生成方法生成水印的過程。其實分為

15、三個環(huán)節(jié):第一,載入原始圖片;第二, 保存新的圖片。創(chuàng)建一個新0, 0 坐標(biāo)開始畫入 src在 src 的右下角畫入載入水印圖片;第三,/* create the bitmap from a byte array * param src the bitmap object you want proecss* param watermark the water mark above the src* return return a bitmap object ,if paramter's length is 0,return null*/private Bitmap createBitm

16、ap( Bitmap src, Bitmap watermark )String tag = "createBitmap"Log.d( tag, "create a new bitmap" );if( src = null )return null;int w = src.getWidth();int h = src.getHeight();int ww = watermark.getWidth();int wh = watermark.getHeight();/create the new blank bitmap創(chuàng)建一個新0 坐標(biāo)開始畫入 src在

17、src 的右下角畫入Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );/ 的和 SRC 長度寬度一樣的位圖Canvas cv = new Canvas( newb );/draw src into cv.drawBitmap( src, 0, 0, null );/ 在 0 ,/draw watermark intocv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );/ 水印/save all clipcv.save( Canvas.ALL_SAVE_FLAG )

18、;/保存/storecv.restore();/ 存儲return newb;7. Canvas 的 save 和 restore onDraw 方法會傳入一個 Canvas 對象,它是你用來繪制控件視覺界面的畫布。在 onDraw 方法里,我們經(jīng)常會看到調(diào)用 save 和 restore 方法,它們到底是干什么用的 呢?? save :用來保存 Canvas 的狀態(tài)。 save 之后,可以調(diào)用 Canvas 的平移、放縮、旋轉(zhuǎn)、 錯切、裁剪等操作。? restore :用來恢復(fù) Canvas 之前保存的狀態(tài)。 防止 save 后對 Canvas 執(zhí)行的操作對后 續(xù)的繪制有影響。save 和 restore 要配對使用( restore 可以比 save 少,但不能多),如果 restore 調(diào)用 次數(shù)比 save 多,會引發(fā) Error 。 save 和 restore 之間,往往夾雜的是對 Canvas 的特殊 操作。例如:我們先想在畫布上繪制一個右向的三角箭頭,當(dāng)然,我們可以直接繪制,另外,我們 也可以先把畫布旋轉(zhuǎn) 90°,畫一個向上的箭頭,然后再

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論