public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initlization();
break;
case MotionEvent.ACTION_UP:
if (mIsCancel && event.getY() < -50) {
cancelRecord();
} else {
finishRecord();
}
mIsCancel = false;
break;
case MotionEvent.ACTION_MOVE:
// 当手指移动到view外面,会cancel
//做一些UI提示
break;
}
return true;
}
一些设计技巧:比如通过回调解耦,使控件变得通用。虽说自定义控件一般不需要多么的通用,但是像录音控件这种很多应用都会用到的功能,还是做得通用一点要好。像录音时弹出的dialog,我采用从外部获取的方式,方便以后修改这个弹窗,也方便代码阅读的时候更加清晰。再比如根据话筒音量改变录音图标这样的方法,设置成外部以后,就算以后更换其他图片,更换其他显示方式,对自定义控件本身来说,不需要改任何代码。
对于录音和放音的功能实现,采用包含关系单独写在一个新类里面,这样方便以后做更多扩展,比如未来采用私有的录音编码加密,比如播放录音之前先放一段音乐(谁特么这么无聊)等等。。。
再来看一下Thread与Handle的交互,这里我设计的并不是很好,其实不应该将两种消息放在同一个msg中发出的,这里主要是考虑到消息简单,使用一个空msg仅仅通过一个int值区分信息就行了。
Handle中采用了一个软引用包含外部类,这种方式在网上有很多讲解,之后我也会单独再写一篇博客讲解,这里大家知道目的是为了防止对象间的互相引用造成内存泄露就可以了。
以上便是对仿微信录音界面的一个讲解,其实微信的录音效果实现起来比起QQ的效果还是比较简单的,以后我也会再讲QQ录音控件的实现方法。