編輯:Android開發實例
Android使用的2D圖形引擎skia,是一個高效的2D矢量圖形庫,google已經把skia開源:http://code.google.com/p/skia/。
SkBitmap是skia中很重要的一個類,很多畫圖動作涉及到SkBitmap,它封裝了與位圖相關的一系列操作,了解它的內存管理策略有助於我們更好的使用它,了解它的初衷是要想實現對skia中的blitter進行硬件加速。
1. SkBitmap的類結構:
2. SkBitmap的內嵌類Allocator
Allocator是SkBitmap的內嵌類,其實只有一個成員函數:allocPixelRef(),所以把它理解為一個接口更合適,SkBitmap使用Allocator的派生類--HeapAllocator作為它的默認分配器。其實現如下:
- bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst,
- SkColorTable* ctable) {
- Sk64 size = dst->getSize64();
- if (size.isNeg() || !size.is32()) {
- return false;
- }
- void* addr = sk_malloc_flags(size.get32(), 0); // returns NULL on failure
- if (NULL == addr) {
- return false;
- }
- dst->setPixelRef(new SkMallocPixelRef(addr, size.get32(), ctable))->unref();
- // since we're already allocated, we lockPixels right away
- dst->lockPixels();
- return true;
- }
當然,也可以自己定義一個Allocator,使用SkBitmap的成員函數allocPixels(Allocator* allocator, SkColorTable* ctable) ,傳入自定義的Allocator即可,如果傳入NULL,則使用默認的HeapAllocator。
3. SkPixelRef類
SkPixelRef和Allocator密切相關,Allocator分配的內存由SkPixelRef來處理引用計數,每個Allocator對應一個SkPixelRef,通常在分配內存成功後,由Allocator調用setPixelRef來進行綁定。默認的情況下,SkBitmap使用SkMallocPixelRef和HeapAllocator進行配對。所以如果你要派生Allocator類,通常也需要派生一個SkPixelRef類與之對應。
4. 使用例子
以下是一段簡短的代碼,示意如何動態分配一個SkBitmap:
- SkBitmap bitmap;
- bitmap.setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config :
- SkBitmap::kRGB_565_Config, width, height);
- if (!bitmap.allocPixels()) {
- return;
- }
- //......
- // 對bitmap進行畫圖操作
- //......
- // 畫到Canvas上
- canvas->drawBitmap(bitmap, SkFloatToScalar(x), SkFloatToScalar(y),
- paint);
本文實例講述了Android編程學習之異步加載圖片的方法。分享給大家供大家參考,具體如下: 最近在android開發中碰到比較棘手的問題,就是加載圖片內存溢出。我
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
前面一篇高仿launcher和墨跡左右拖動效果獲得了很多朋友的好評,上一篇文章主要是通過自定義ViewGroup實現的,有點麻煩。今天用ViewPager這個類實
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我