這個是爲實現全屏手寫輸入準備的。
Android平臺自身提供了一個底層的顯示接口-FLINGER服務,通過這個接口,我們可以實現創建一個新的顯示區域來繪製想要的顯示內容,並和原有的屏幕輸出混合輸出到屏幕上。
要在普通應用裏使用這個接口,
1、必須指定在AndroidManifest.xml裏指定android.permission.ACCESS_SURFACE_FLINGER權限,添加:
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
2、用系統KEY來簽名包,在Android.mk裏寫上:
LOCAL_CERTIFICATE := platform
然後就可在應用裏使用FLINGER服務了,實例片段如下:
- mSurfaceSession = new SurfaceSession(); //連接到FLINGER服務
- try {
- //創建一個Surface,並在上面繪製
- mSurface = new Surface(mSurfaceSession,
- Process.myPid(),
- Display.DEFAULT_DISPLAY,
- 240, 320,
- PixelFormat.TRANSPARENT,
- 0);
- //通過剛創建的Surface裏獲取一個Canvas,通過這個接口來繪製
- Canvas canvas = mSurface.lockCanvas(null);
- canvas.drawColor(0x0);
- Paint p = new Paint();
- p.setColor(Color.RED);
- canvas.drawLine(0, 0, 240, 320, p);
- canvas.drawLine(240, 0, 0, 320, p);
- //提交更新,讓新的內容輸出到屏幕
- mSurface.unlockCanvasAndPost(canvas);
- mSurface.openTransaction();
- //mSurface.setPosition(0, 0);
- //mSurface.setSize(240, 320);
- //讓這個Surface顯示到最上層
- mSurface.setLayer(99999);
- mSurface.show();
- mSurface.closeTransaction();
- }
- catch (OutOfResourcesException e)
- {
- Log.e(TAG, e.toString());
- }
通過SurfaceSession, 我們可以創建多個Surface, Surface之間的混合是由FLINGER服務直接完成的, 使用者不需要關心, 直接在繪製即可。
如果內核支持多層, 通過打開/dev/fbX來直接寫屏,應該可以實現相同的效果, 不過貌似用官方接口正規一些。
沒圖沒真相,上示例的圖