安卓开发个人小作品(1) - 有声计算器

大家好,最近才开始写博客,准备先整理一下学习安卓以来,自己做的一些“小玩意”,在回顾知识的同时,也希望可以帮助到有需要的开发者们!!嘻嘻,开始吧!

计算器的实现,并不是这个“小玩意”的重点,同时,我也相信很多初级开发者都可以开发出比我这个计算器功能更加强大,界面更加炫酷的计算器,所以这篇文章主要是介绍实现计算器的有声效果!记得刚实现的时候,觉得好玩,对着扣了好多666!!!哈哈哈哈!!!

语音播放原理

关于实现有声效果,涉及到的核心类就是TextToSpeech,没用过这个类的可以去看下API,类的关系如下

可以看到这是一个直接继承于Object的类。构造方法也比较简单,如下:


下面解释的很清楚,第一个方法是使用默认的TTS引擎,也就是手机自带的。第二个方法,是使用指定的TTS引擎,可以看到第三个参数用来指定用什么引擎

再看看看常用的一些方法


setPitch--设置音调,音调越高,越接近女声,为1.0时,正常播放音调,高于1.0,越尖音,低于1.0,越低音

setSpeechRate--设置语音播报的速率,为1.0时,正常播放速率,高于1.0,快播,低于1.0,慢播

setVoice--设置声音,传入一个Voice对象即可,可以用TextToSpeech的getVoices()来获取Voice对象

shutdown--释放引擎资源

stop--停止当前的语音播放,使用时,在shutdown方法之前,也就是先stop再shutdown

此外还有setLanguage等方法,用法也比较简单,就不赘述了。

核心方法:speak

 
 

可以看到官方文档说的非常清楚,这个方法已经被弃用了,所以我们在使用的时候就不要用这个方法了,用这个

参数一:text  要播放的文字

参数二:播放策略,采用队列的方式,一共有两个值QUEUE_ADD和QUEUE_FLUSH,是什么意思呢?假设一个情况,当前tts正在播放语音当中,还需要一段时间才可以放完,如果为QUEUE_ADD,那么此时新播放的语音将会在当前语音播放完了才播放,如果为QUEUE_FLUSH,那么将会终止当前的语音播放,立即播放需要播放的语音。可以很容易联想到这里是使用的队列来管理的。

参数三:一般情况下可以为空,官方文档解释是,用于传递特定引擎参数。

参数四:用于指定当前这次的请求的唯一性。

好了,TextToSpeech了解的差不多了,还需要知道的是,TextToSpeech初始化引擎用到的一个接口OnInitListener

回调方法init()方法会返回一个status,用于判断是否成功,一般在这里设置语言以及对语言设置失败的情况进行处理,代码如下

计算器的实现

然后计算器的实现,我就不多说了,网格布局,,或者普通的线性布局也可以,模仿一下常用计算器的界面,然后可以封装一个用于播放的方法类,这样代码简洁点,由于代码量都很少,不过十行的事,基本把我上面说的了解了,自己动手写没什么问题,相关的代码也都是重复的,一些按钮的点击事件,所以就没必要贴了。

不过除了界面之外,要想实现一个完整的计算器的逻辑还是需要花点功夫的,比如

(1)减号不仅可以作为减号,还可以作为负号(细枝末节的问题比较多,这里仅列举一个作为参考)

(2)连续运算,连 加/减/乘/除 的的实现(考验基本功的时候到咯)

(3)数值范围以及数值精度的处理(数值精度问题提醒一下,BigDecimal)

当然还会有其它的很多问题,那就不是本文的重点啦!!

温馨提示

如果按照本文的思路,最后发现文字没有转化成语音播放,比如我之前的红米手机,/呜呜呜,当时搞了好久,不过我都为你把坑填平啦,请检查你的手机是否有如下问题!

(1)音量没打开,静音怎么可能听得到!(我当时还真以为是代码的问题!-.-||)

(2.)检查是否支持中文的TTS(文字转语音)输出,怎么查看呢,打开手机的设置-->>语言和输入法-->>文字转语音(TTS)输出,点开你会看到你手机目前支持的TTS引擎,我当时系统默认的引擎是不支持中文的,结果,我代码改了N遍,,,,你懂的,,,都是泪啊,总之有遇到的希望这篇文章能帮你跳过这个坑就行。

当然肯定又有小伙伴问,要是我的手机TTS输出默认不支持中文,这可怎么办呀,答案就是,点击科大讯飞,进入官网下载语音引擎,安装在手机上即可,然后,进入手机的设置,你会发现,有一项就是刚才安装的科大讯飞语音引擎,然后设置当前语音引擎为科大讯飞的即可。

如果你顺利完成了上述操作,那么还在等什么,运行APP扣666啊!!!!

最后再放一张我当时最后完成的效果吧!轻喷,原谅我当时还是初学者(以及这个配色)!!

好辣,今天就到这吧!!下次见!!

源码下载

有声计算器源码下载