不多说,先上图

核心代码如下:主要是用过获取点击事件得距离来实现

package fan.soundrecordingdemo;import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;import fan.soundrecordingdemo.utils.AudioRecoderUtils;
import fan.soundrecordingdemo.utils.PopupWindowFactory;
import fan.soundrecordingdemo.utils.TimeUtils;public class MainActivity extends AppCompatActivity {static final int VOICE_REQUEST_CODE = 66;private ImageButton mButton;private ImageView mImageView;private TextView mTextView,tv_cancel;private AudioRecoderUtils mAudioRecoderUtils;private Context context;private PopupWindowFactory mPop;private RelativeLayout rl;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);context = this;rl = (RelativeLayout) findViewById(R.id.rl);mButton = (ImageButton) findViewById(R.id.button);  //录音按钮//PopupWindow的布局文件final View view = View.inflate(this, R.layout.layout_microphone, null);mPop = new PopupWindowFactory(this,view);//PopupWindow布局文件里面的控件mImageView = (ImageView) view.findViewById(R.id.iv_recording_icon);mTextView = (TextView) view.findViewById(R.id.tv_recording_time);tv_cancel=(TextView)view.findViewById(R.id.tv_cancel) ;mAudioRecoderUtils = new AudioRecoderUtils();//录音回调mAudioRecoderUtils.setOnAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() {//录音中....db为声音分贝,time为录音时长@Overridepublic void onUpdate(double db, long time) {mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100));mTextView.setText(TimeUtils.long2String(time));}//录音结束,filePath为保存路径@Overridepublic void onStop(String filePath) {Toast.makeText(MainActivity.this, "录音保存在:" + filePath, Toast.LENGTH_SHORT).show();Log.i("******record——savepath*",filePath);mTextView.setText(TimeUtils.long2String(0));}public void onCancel() {Toast.makeText(MainActivity.this, "取消保存" , Toast.LENGTH_SHORT).show();mTextView.setText("0.00");}});//6.0以上需要权限申请requestPermissions();}/*** 开启扫描之前判断权限是否打开*/private void requestPermissions() {//判断是否开启摄像头权限if ((ContextCompat.checkSelfPermission(context,Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) &&(ContextCompat.checkSelfPermission(context,Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED)) {StartListener();//判断是否开启语音权限} else {//请求获取摄像头权限ActivityCompat.requestPermissions((Activity) context,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, VOICE_REQUEST_CODE);}}/*** 请求权限回调*/@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == VOICE_REQUEST_CODE) {if ((grantResults[0] == PackageManager.PERMISSION_GRANTED) && (grantResults[1] == PackageManager.PERMISSION_GRANTED) ) {StartListener();} else {Toast.makeText(context, "已拒绝权限!", Toast.LENGTH_SHORT).show();}}}public void StartListener(){//Button的touch监听mButton.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {int start_x=0,start_y=0,end_x,end_y,mov_x,mov_y;switch (event.getAction()){case MotionEvent.ACTION_DOWN:tv_cancel.setTextColor(Color.parseColor("#FFFFFF"));tv_cancel.setText("手指上划,取消保存");mImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.record_microphone));mButton.setImageDrawable(context.getResources().getDrawable(R.drawable.record_bottomdown));mPop.showAtLocation(rl, Gravity.CENTER, 0, 0);start_x=(int)event.getX();start_y=(int)event.getY();mAudioRecoderUtils.startRecord();break;case MotionEvent.ACTION_UP:end_x=(int) event.getX();end_y=(int)event.getY();mov_x=Math.abs(start_x-end_x);mov_y=Math.abs(start_y-end_y);if(mov_x>200||mov_y>200){//上划取消//  mAudioRecoderUtils.cancelRecord();    //取消录音(不保存录音文件)mPop.dismiss();mButton.setImageDrawable(context.getResources().getDrawable(R.drawable.record_bottom));Log.i("******mov_x,y",String.valueOf(mov_x)+";"+String.valueOf(mov_y));break;}else {mAudioRecoderUtils.stopRecord();//结束录音(保存录音文件)Log.i("*****record_Time",String.valueOf(mAudioRecoderUtils.stopRecord()));
//                        mAudioRecoderUtils.cancelRecord();    //取消录音(不保存录音文件)mPop.dismiss();mButton.setImageDrawable(context.getResources().getDrawable(R.drawable.record_bottom));tv_cancel.setTextColor(Color.parseColor("#FFFFFF"));break;}case MotionEvent.ACTION_MOVE:end_x=(int) event.getX();end_y=(int)event.getY();mov_x=Math.abs(start_x-end_x);mov_y=Math.abs(start_y-end_y);if(mov_x>150||mov_y>150) {tv_cancel.setText("取消录音");tv_cancel.setTextColor(Color.parseColor("#ff0000"));mAudioRecoderUtils.cancelRecord();    //取消录音(不保存录音文件)mButton.setImageDrawable(context.getResources().getDrawable(R.drawable.record_stop));mImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.record_stop));Log.i("******mov_x,y",String.valueOf(mov_x)+";"+String.valueOf(mov_y));}break;}return true;}});}}

下面是Androidstudio源码链接:http://download.csdn.net/detail/u011128775/9808930

高仿微信上划取消录音相关推荐

  1. 高仿微信上传头像附带压缩,旋转图片,附加demo

    本人初学者,再做项目时要求上传头像要像微信那种,需要外面裁剪框不动,里面图片可以改变大小,android系统裁剪和所要求的完全相反,所以,对于这个问题,困扰了我将近一个月,不断的修改,不断的出现新问题 ...

  2. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  3. android 微信高仿,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

  4. iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码

    iOS精选源码 Swift-图片画框标注 Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用) iOS tabbar上的提示框 Swift图片浏览器,经过一年多维护,已基本稳定 图片滤镜 ...

  5. iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码...

    iOS精选源码 Swift-图片画框标注 Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用) iOS tabbar上的提示框 Swift图片浏览器,经过一年多维护,已基本稳定 图片滤镜 ...

  6. GitHub上有个高仿微信的开源项目,超厉害的!

    开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 来源 | GitHub科技 前言 该项目是一款高仿微信的开源项目,iOSAppTemplate ...

  7. 今日上新推荐源码,高仿微信社交,高仿拼多多商城

    Flutter社交App源码 介绍:利用 Flutter 来高仿微信(WeChat) 7.0.0+ App,代码规范惊为天人.注释详解令人发指.细节处理精益求精.核心功能配备文档.接近98%还原度的原 ...

  8. Kotlin高仿微信-第11篇-单聊-语音

     Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册.登录.主页.单聊(文本.表情.语音.图片.小视频.视频通话.语音通话.红包.转账).群聊.个人信息.朋友圈.支付服务.扫一扫.搜 ...

  9. Flutter高仿微信-第26篇-新的朋友

    Flutter高仿微信系列共59篇,从Flutter客户端.Kotlin客户端.Web服务器.数据库表结构.Xmpp即时通讯服务器.视频通话服务器.腾讯云服务器全面讲解. 详情请查看 效果图: 实现代 ...

最新文章

  1. 2.4g 无线键鼠对码软件_富德iK8900无线键鼠套装评测:静音纤薄
  2. 合种侧柏、云杉专车2-3天领证
  3. 静态方法和实例化方法的区别
  4. 记一次用iview实现表格合并单元格的具体操作
  5. ArrayBlockingQueue队列
  6. jenkins查询mysql_jenkins流水线使用mysql数据库
  7. php引用shell变量,Linux Shell Bash变量的间接引用 - Powered by PHPWind....
  8. PHP对象的内存模型
  9. linux下缓存命中测试,linux为什么报表缓存缓存未命中?_linux_开发99编程知识库...
  10. 【LeetCode】3月23日打卡-Day8
  11. java拖动图片拼图_求教,我的这个拼图程序中的移动图片的改怎么做
  12. python 3中 的subprocess
  13. swoole/php-cp 安装
  14. 缺陷管理规范--bug管理流程
  15. Android 四大组件之一(Activity)
  16. 使用5502自带的UART口发送数据乱码的问题
  17. mysql spatial简介_详细介绍mysql索引类型:FULLTEXT、NORMAL、SPATIAL、UNIQUE
  18. The retrospective material for unit_4 Survival
  19. 重启docker时:Error starting userland proxy: listen tcp 0.0.0.0:9000: listen: address already in use
  20. 微信小程序-书籍阅读 【阅读、小说阅读、图书、世界读书日、爱读书爱分享】

热门文章

  1. MobPush for Flutter
  2. 阿里云RDS-NAS-OSS
  3. 河北源达靠谱吗?股市如战场,可靠的选股软件很关键
  4. PHP面向对象开发:类成员的相关知识
  5. SQL语句编写经典50题
  6. python读取千万级数据库数据类型_解决python读取几千万行的大表内存问题
  7. Unity3D FPS帧数修改
  8. 自主实现sleep函数(代码实现)
  9. 小程序获取头像昵称最新版本
  10. oracle OCP考点在哪,Oracle OCP认证考哪几门