为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

微笑出品 2016-07-03 17:10:51
问题描述:按住录音按钮滑动时,超出取消录音范围后返回的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 回答

?
米沙之国

TA贡献30条经验 获得超16个赞


不会.......

查看完整回答
反对 回复 2016-07-08
  • 1 回答
  • 1 关注
  • 1972 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信