不多说,先上图
核心代码如下:主要是用过获取点击事件得距离来实现
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;
@Override
protected 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为录音时长
@Override
public void onUpdate(double db, long time) {
mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100));
mTextView.setText(TimeUtils.long2String(time));
}
//录音结束,filePath为保存路径
@Override
public 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);
}
}
/**
* 请求权限回调
*/
@Override
public 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() {
@Override
public 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