在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

仿微信语音聊天 弹出的dialog总是自动变回最初的样子

问题描述:按住录音按钮滑动时,超出取消录音范围后返回的dialog视图闪一下后又自动变成录音状态的视图,录音过短也是这样闪一下又变回最初的dialog视图,不知道哪里逻辑错了造成他又掉最初的显示视图。(字数限制所以删掉了一鞋方法) RecordarButton 类↓ package com.example.administrator.myapplication.recorderchat.customview; public class RecordarButton extends Button implements AudioManager.OnAudioPrepareWellListener {     private Context mContext;     //正在录音     private final int RECORDARING = 1;     //取消录音     private final int WANT_TO_CANCEL = -1;     //等待录音     private final int RECORDAR_NORMAL = 0;     //当前状态     private int currState = RECORDARING;     //是否正在录音    是否完成录音准备     private boolean isRecordar, isReady;     //Y轴上滑取消距离     private final int DISTANCE_Y_CANCEL = 50;     private DialogManager mDialogManager;     private AudioManager mAudioManager;     private String dir;     private final int AUDIO_PREPARED = 1;     private final int AUDIO_VOLUME = 2;     private final int AUDIO_CANCEL = 3;     private final int MAXVOLUME = 7;     private float totalTime;     private Handler mHandler = new Handler() {         @Override         public void handleMessage(Message msg) {             super.handleMessage(msg);             switch (msg.what) {                 case AUDIO_PREPARED:                     mDialogManager.show();                     new Thread(new GetVolumeRunnable()).start();                     break;                 case AUDIO_VOLUME:                     mDialogManager.updateVolume(mAudioManager.getVolume(MAXVOLUME));                     break;                 case AUDIO_CANCEL:                     mDialogManager.dismiss();                     break;             }         }     };     private OnAudioRecorderDoneListener mListener;     public interface OnAudioRecorderDoneListener {         void OnAudioRecorderDone(float totalTime, String filePath);     }     public void setOnAudioRecorderDoneListener(OnAudioRecorderDoneListener listener) {         mListener = listener;     }     public RecordarButton(Context context) {         this(context, null);     }     public RecordarButton(Context context, AttributeSet attrs) {         super(context, attrs);         mContext = context;         dir = Environment.getExternalStorageDirectory() + "/store_temp_audios";         mAudioManager = new AudioManager(dir);         mDialogManager = new DialogManager(context);         mAudioManager.setOnAudioPrepareWellListener(RecordarButton.this);         setOnLongClickListener(new OnLongClickListener() {             @Override             public boolean onLongClick(View v) {                 //长按弹出dialog窗口 //                isReady = true; //                mAudioManager.setOnAudioPrepareWellListener(RecordarButton.this); //                mAudioManager.prepareAudio(); //                isRecordar = true;                 isReady = true;                 mAudioManager.prepareAudio();                 isRecordar = true;                 return true;             }         });     }     /**      * 每0.1秒获开一下当前音频振幅,累加时间      */     class GetVolumeRunnable implements Runnable {         @Override         public void run() {             while (isRecordar) {                 try {                     Thread.sleep(100);                     totalTime += 0.1f;                     mHandler.sendEmptyMessage(AUDIO_VOLUME);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }         }     }     /**      * 实现音频准备完毕的回调方法      */     @Override     public void audioPrepareWell() {         mHandler.sendEmptyMessage(AUDIO_PREPARED);     }     /**      * 重写onTouchEvent事件      *      * @param event      * @return      */     @Override     public boolean onTouchEvent(MotionEvent event) {         //获开事件类型         int action = event.getAction();         //获开坐标         int x = (int) event.getX();         int y = (int) event.getY();         switch (action) {             //当按钮按下时.改变按钮状态             case MotionEvent.ACTION_DOWN:                 changeState(RECORDARING);                 break;             //如果正在录音 判断用户滑动意图             case MotionEvent.ACTION_MOVE:                 if (isRecordar) {                     if (wangToCancel(x, y)) {                         //如果想取消 改变按钮状态为取消                         changeState(WANT_TO_CANCEL);                     } else {                         //如果不取消 改变按钮状态为录音状态                         changeState(RECORDARING);                     }                 }                 break;             //当用户松开手指 将状态和标记都置回最初             case MotionEvent.ACTION_UP:                 if (!isReady) {                     reset();                     break;                 }                 if (!isRecordar || totalTime < 1) {                     mDialogManager.tooShort();                     mAudioManager.cancelAudio();                     mHandler.sendEmptyMessageDelayed(AUDIO_CANCEL, 1300);                 } else if (currState == RECORDARING) {                     //正常录制完成                     mAudioManager.release();                     mDialogManager.dismiss();                 } else if (currState == WANT_TO_CANCEL) {                     mAudioManager.cancelAudio();                     mDialogManager.dismiss();                 }                 reset();                 break;         }         return super.onTouchEvent(event);     }     /**      * 执行完后重置工作      */     private void reset() {         isRecordar = isReady = false;         totalTime = 0;         changeState(RECORDAR_NORMAL);     }     /**      * 判断用户移动的意图      *      * @param x      * @param y      * @return      */     private boolean wangToCancel(int x, int y) {         if (x < 0 || x > getWidth() || y < -DISTANCE_Y_CANCEL || y > getHeight() + DISTANCE_Y_CANCEL)             return true;         return false;     }     /**      * 根据当前状态 改变按钮样式      *      * @param state      */     private void changeState(int state) {         if (currState != state) {             currState = state;             switch (currState) {                 case RECORDAR_NORMAL:                     setBackgroundResource(R.drawable.recordar_btn_shape_normal);                     setText(R.string.recordar_normal);                     break;                 case RECORDARING:                     setBackgroundResource(R.drawable.recordar_btn_shape_selected);                     setText(R.string.recordar_down);                     mDialogManager.recordaring();                     break;                 case WANT_TO_CANCEL:                     setBackgroundResource(R.drawable.recordar_btn_shape_selected);                     setText(R.string.recordar_cancel);                     mDialogManager.wantToCancel();                     break;             }         }     } }

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与1

不会.......

使用道具 举报

发新帖
国内首家创新型IT技术需求众包服务平台,软件需求就上天盟网! 立即登录 立即注册