Android仿ca368亚洲城官网微信录音功能自定义控件的设计技巧

  最近由于需要做一个录音功能(/嘘 悄悄透露一下,千万别告诉红薯,就是新版本的OSC客户端噢),起初打算采用仿微信的录音方式,最后又改成了QQ的录音方式,之前的微信录音控件也就白写了[大哭]。之前有很多朋友在问我自定义控件应该怎么学习,遂正好拿出来讲讲喽,没来得及截效果图,大家就自己脑补一下微信发语音时的样子吧。

  所谓自定义控件其实就是由于系统SDK无法完成需要的功能时,通过自己扩展系统组件达到完成所需功能做出的控件。

  Android自定义控件有两种实现方式,一种是通过继承View类,其中的全部界面通过画布和画笔自己创建,这种控件一般多用于游戏开发中;另一种则是通过继承已有控件,或采用包含关系包含一个系统控件达到目的,这也是接下来本文所要讲到的方法。绝缘球壳上

  作为控件界面控制逻辑,我们主要看一下onTouchEvent方法:当手指按下的时候,初始化录音器。手指在屏幕上移动的时候如果滑到按钮之上的时候,event.getY会返回一个负值(因为滑出控件了嘛)。这里我写的是-50主要是为了多一点缓冲,防止误操作。

  一些设计技巧:比如通过回调解耦,使控件变得通用。虽说自定义控件一般不需要多么的通用,但是像录音控件这种很多应用都会用到的功能,还是做得通用一点要好。像录音时弹出的dialog,我采用从外部获取的方式,方便以后修改这个弹窗,也方便代码阅读的时候更加清晰。再比如根据话筒音量改变录音图标这样的方法,设置成外部以后,就算以后更换其他图片,更换其他显示方式,对自定义控件本身来说,不需要改任何代码。

  对于录音和放音的功能实现,采用包含关系单独写在一个新类里面,这样方便以后做更多扩展,比如未来采用私有的录音编码加密,比如播放录音之前先放一段音乐(谁特么这么无聊)等等。。。

  再来看一下Thread与Handle的交互,这里我设计的并不是很好,其实不应该将两种消息放在同一个msg中发出的,这里主要是考虑到消息简单,使用一个空msg仅仅通过一个int值区分信息就行了。

  Handle中采用了一个软引用包含外部类,这种方式在网上有很多,之后我也会单独再写一篇博客,这里大家知道目的是为了防止对象间的互相引用造成内存泄露就可以了。

  以上便是对仿微信录音界面的一个,其实微信的录音效果实现起来比起QQ的效果还是比较简单的,以后我也会再讲QQ录音控件的实现方法。

  本站(LinuxIDC)所刊载文章不代表同意其说法或描述,仅为提供更多信息,也不构成任何。

发表评论