Android全屏绘制 Surface的使用

这个是为实现全屏手写输入准备的。

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服务了,实例片段如下:



  1. mSurfaceSession = new SurfaceSession(); //连接到FLINGER服务  
  2. try {  
  3.            //创建一个Surface,并在上面绘制  
  4.     mSurface = new Surface(mSurfaceSession,   
  5.             Process.myPid(),   
  6.             Display.DEFAULT_DISPLAY,   
  7.             240, 320,   
  8.             PixelFormat.TRANSPARENT,  
  9.             0);  
  10.        //通过刚创建的Surface里获取一个Canvas,通过这个接口来绘制  
  11.     Canvas canvas = mSurface.lockCanvas(null);  
  12.       
  13.     canvas.drawColor(0x0);  
  14.     Paint p = new Paint();  
  15.       
  16.     p.setColor(Color.RED);  
  17.     canvas.drawLine(0, 0, 240, 320, p);  
  18.     canvas.drawLine(240, 0, 0, 320, p);  
  19.     //提交更新,让新的内容输出到屏幕  
  20.     mSurface.unlockCanvasAndPost(canvas);  
  21.       
  22.     mSurface.openTransaction();  
  23.       
  24.     //mSurface.setPosition(0, 0);  
  25.     //mSurface.setSize(240, 320);  
  26.        //让这个Surface显示到最上层  
  27.     mSurface.setLayer(99999);  
  28.     mSurface.show();  
  29.     mSurface.closeTransaction();  
  30. }   
  31. catch (OutOfResourcesException e)  
  32. {  
  33.     Log.e(TAG, e.toString());  


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.toStrin



通过SurfaceSession, 我们可以创建多个Surface, Surface之间的混合是由FLINGER服务直接完成的, 使用者不需要关心, 直接在绘制即可。

如果内核支持多层, 通过打开/dev/fbX来直接写屏,应该可以实现相同的效果, 不过貌似用官方接口正规一些。

没图没真相,上示例的图


你可能感兴趣的:(android,null,平台)