高仿微信上划取消录音

不多说,先上图

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值