Android開發(fā)者學(xué)習(xí)筆記ViewCanvasbitmap_第1頁(yè)
Android開發(fā)者學(xué)習(xí)筆記ViewCanvasbitmap_第2頁(yè)
Android開發(fā)者學(xué)習(xí)筆記ViewCanvasbitmap_第3頁(yè)
Android開發(fā)者學(xué)習(xí)筆記ViewCanvasbitmap_第4頁(yè)
Android開發(fā)者學(xué)習(xí)筆記ViewCanvasbitmap_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

2、類的 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();使用 BitmapF

3、actory 獲取位圖( 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 ,這個(gè)輔助類可以通過(guò)資源 ID 、路徑、文件、數(shù)據(jù) 流等方式來(lái)獲取位圖。以上方法在編程的

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

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

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

7、nDraw 中顯示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);public vo

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

9、建一個(gè)新的位圖: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. ),不過(guò)要注意此時(shí)整個(gè)畫布都縮放了。( 4 )借助 Matrix :Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pi

10、c180);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來(lái)實(shí)現(xiàn)。Bitmap bmp = BitmapFactory.deco

11、deResource(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)效果:TestDrawablfi 3:49 AM6.圖片

12、水印的生成方法生成水印的過(guò)程。其實(shí)分為三個(gè)環(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 paramters length is 0,return null */private Bitmap createBitmap( Bitmap src, Bitmap

13、 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 bitmapBitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );/ 的和

14、 SRC 長(zhǎng)度寬度一樣的位圖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();/ 存儲(chǔ)return newb;6. 圖片水印的生成方法生成水印的過(guò)程。其實(shí)分為三個(gè)環(huán)節(jié):第一,載入原始圖片;

15、第二, 保存新的圖片。創(chuàng)建一個(gè)新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 paramters length is 0,return null*/private Bitmap createBitmap( Bitmap src, Bitm

16、ap 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)建一個(gè)新0 坐標(biāo)開始畫入 src在 src 的右下角畫入Bitmap newb = Bitmap.createBitmap

17、( w, h, Config.ARGB_8888 );/ 的和 SRC 長(zhǎng)度寬度一樣的位圖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 );/保存/storecv.restore();/ 存儲(chǔ)return newb;7. C

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論