前言
最近刚换了三星的Note9,深度体验了一下Bixby的语音功能,觉得挺不错的,而且上周的人工智能大会上,分布屏幕两边的分别是科大讯飞和腾讯提供的服务:讯飞听见和腾讯同传。两者的表现也都是让人眼前一亮。
我在自己的E码通中已经集成的讯飞语音识别《集成科大讯飞语音识别查找货品信息》,里面用的是讯飞语音识别的默认控件,如图
另一篇文章《Android集成科大讯飞SDK实现语音识别》里面也有用到了SurfaceView,但是就没做过介绍,正好今天要以公司的产品里面实现语音实别,正好修改一下识别的UI,就用到了SurfaceView。
SurfaceView简介
SurfaceView本身是一个View,符合一切View的特性,需要通过Canvas画布绘制。可以在另一个线程中更新界面,不会阻碍界面的交互。
SurfaceView 绘图效率较高,用于界面更新频繁的程序,如相机预览。一些游戏的动画效果也一般用SurfaceView来实现。
实现效果
我们这次想实现的效果是说上去的话能够直接显示在弹出的语音实别框里,如下图
整个视频是操作的演示效果
https://v.qq.com/x/page/i1349c7nts8.html
代码演示
语音实别的这块实现主要还是看《Android集成科大讯飞SDK实现语音识别》文章里的介绍吧,我们这次的代码主要是看SurfaceView
(1)创建SurfaceView
创建自定义的SurfaceView继承自SurfaceView,并实现两个接口:SurfaceHolder.Callback代码如下:
通过实现这个接口,就需要在自定义的SurfaceView中实现接口的方法,对于SurfaceHolder.Callback方法,需要实现如下方法,其实就是SurfaceView的生命周期:
上面的DrawText是我们的核心方法,一会儿再介绍
(2)初始化SurfaceView
在自定义的SurfaceView的构造方法中,需要对SurfaceView进行初始化,包括SurfaceHolder的初始化、如支持透明度,防止被其它控件遮挡。代码如下:
(3)使用SurfaceView
通过SurfaceHolder对象的lockCanvans()方法,我们可以获取当前的Canvas绘图对象。接下来的操作就和自定义View中的绘图操作一样了。需要注意的是这里获取到的Canvas对象还是继续上次的Canvas对象,而不是一个新的对象。因此,之前的绘图操作都会被保留,如果需要擦除,则可以在绘制前,通过定义一个Paint,然后drawPaint()方法来进行清屏操作。
核心方法DrawText
上面这段可以看到,我们先通过SurfaceHolder对象的lockCanvans()获取到canvas,然后利用了一个Paint进行了一次清屏操作,防止上次字符重叠,接下来就是用的TextPaint进行文字的绘制。
到这里我们的SurfaceView就已经定义好了。
调用SurfaceView
我们新建一个IattextActivity
然后对应的布局文件里面加入我们的TextSurfaceview和一个ImageView
效果如下:
调用SurfaceView
整个Activity的代码
-END-