现在的位置: 首页 > 综合 > 正文

全屏绘制

2013年10月03日 ⁄ 综合 ⁄ 共 2902字 ⁄ 字号 评论关闭

http://blog.csdn.net/linux_lyb/article/details/4196867
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服务了,实例片段如下:

[c-sharp] view
plain
copy

  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());  
  34. }  

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

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

没图没真相,上示例的图

http://www.eoeandroid.com/thread-69804-1-1.html

我们开发者都知道的,在android系统中,到目前为止没有一个接口可以让应用随时获取touch时间,touch事件是非常有用的,在我们设置全屏手写这个事件更是非常重要的一个部分。我们要知道手写输入的实现主要分为3个部分:

        1、笔画的获取 
        2、笔画的绘制 
        3、笔画的识别 

       在以往broncho项目中,根据平时的交流和对WM的粗略接触,以往全屏手写的笔画获取都是在WM里处理来实现笔画数据获取的。这一次在android系统上实现全屏手写,稍微改变了一下思路:

       1、WM提供一个touch事件发送接口,让应用可以注册一个touch事件监听。事件监听函数返回trueWM不再处理这个事件,返回falseWM继续分发这个事件。 
       2、WM提供一个touch事件发送接口,让应用可以模拟发送touch事件。 
       3、修改WM事件分发函数,在分发touch事件到应用前,先调用事件监听函数。发送touch事件的接口可以直接调用WM的接口。 
       4、WM就做了这些修改,笔画的获取处理放到了全屏手写输入法中。 

       目前的测试结果是笔画的获取还有不足,如多余的MOVE事件没有过滤(多余的MOVE事件就是没有收到DOWN事件时收到了MOVE事件);在模拟器上鼠标点击和实际手指触碰是完全不同的处理的,导致无法点击按钮。

       修改的文件和要点:
       添加和实现两个接口

Java代码:

  1. void setGlobalPointerEventListener(IWindow window);
  2. boolean injectGlobalPointerEvent(in MotionEvent event, boolean sync);

  3. frameworks/base/core/java/android/view/IWindowSession.aidl

  4. frameworks/base/services/java/com/android/server/WindowManagerService.java 

复制代码


       添加接口

Java代码:

  1. boolean dispatchGlobalPointer(in MotionEvent event, long eventTime);
  2. frameworks/base/core/java/android/view/IWindow.aidl

复制代码


      添加接口引用

Java代码:

  1. frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java 

复制代码


       修改接口实现

Java代码:

  1. frameworks/base/core/java/android/view/ViewRoot.java
  2. frameworks/base/core/java/android/view/SurfaceView.java 

复制代码


       呵呵,这样我们就是大致的用法,大家要是有别的很好的方法,不妨给我回个帖子,这样我也好看看你的思路是什么样的。打家要是看我写的不对,也可以写出来,这样在大家的指点中,我才能成长,这样我才能听到真的话,才能知道我的不足。高手们就多多指点我吧,在这里先谢谢大家了。

抱歉!评论已关闭.