Tiger_Dog

Android全屏绘制

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

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服务了,实例片段如下:
view plaincopy to clipboardprint?
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());  

     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来直接写屏,应该可以实现相同的效果, 不过貌似用官方接口正规一些。

没图没真相,上示例的图

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linux_lyb/archive/2009/05/18/4196867.aspx

posted on 2011-04-10 12:18  Tiger_Dog  阅读(528)  评论(0)    收藏  举报

导航