Android2.1的瀏覽器外掛程式有兩種渲染模式,在android_npapi.h裡的定義分別是:
kBitmap_ANPDrawingModel = 0;
kSurface_ANPDrawingModel = 1;
(後面簡稱bitmap模式和surface模式)。
在執行個體初始化的時候(Plugin函數列表的newp被調用時),Plug-in需要告知瀏覽器採用何種渲染方式。
下面就對這兩種渲染方式作簡要介紹:
1.bitmap模式
kBitmap_ANPDrawingMode是傳統的渲染方式,這種方式下,瀏覽器的底層會通過調用Plug-in提供的NPP_HandleEvent函數觸發繪製事件,並把要渲染的bitmap的地址作為參數的一部分傳給plug-in,plug-in只需要使用在初始化時擷取到的相關的ANPInterface進行繪製即可。這種模式下,plug-in不需要考慮縮放問題,畫面的縮放會由webkit自行處理。
//===================================
2.surface模式
kSurface_ANPDrawingMode帶有Android平台的特殊性,因為這種模式是需要Java側配合的。這種模式下,Plug-in會在初始化時把自己的PluginStub的類名告知webkit,webkit會根據這個類名,並結合npp參數,在Java側擷取到對應的view,並加到自己的布局裡面。要使用這種模式,plug-in必須實現一個繼承於PluginStub的類,這個類和SurfaceView有點類似,而且需要自己實現縮放。
根據android_npapi.h裡的描述,Surface模式的效能要比bitmap模式好,但是我在模擬器上測試時發現surface模式在縮放時會出現閃爍。不過現在android2.2的nexus one上的flash10.1貌似就是surface模式的,但是沒有閃爍,看來google為了支援Flash,在最近幾版Android上對webkit作了不少修改。