public?class?AudioRecorderButton?extends?Button?{
private?static?final?int?DISTANCE_Y_CANCEL?=?50;
/**?按鈕的三種狀態?*/
private?static?final?int?STATE_NORMAL?=?1;//?正常狀態
private?static?final?int?STATE_RECRODING?=?2;//?錄音狀態
private?static?final?int?STATE_WANT_CANEL?=?3;//?取消狀態
private?int?mCurSTATE?=?STATE_NORMAL;//?變量?記錄當前按鈕的狀態?默認下為正常狀態
private?boolean?isRecording?=?false;//?如果是已經開始錄音
private?DialogManager?mDialogManager;
public?AudioRecorderButton(Context?context,?AttributeSet?attrs)?{
super(context,?attrs);
mDialogManager?=?new?DialogManager(getContext());
setOnLongClickListener(new?OnLongClickListener()?{
@Override
public?boolean?onLongClick(View?v)?{
mDialogManager.showRecordingDialog();
isRecording?=?true;
return?false;
}
});
}
public?AudioRecorderButton(Context?context)?{
this(context,null);
}
/**
*?重寫按鈕Button?的?onTouchEvent方法
*/
@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://?按鈕按下
?????Log.e("AudioRecorderButton",?"已經按下-------x="+x+"y="+y);
?????changeState(STATE_RECRODING);
?????break;
?case?MotionEvent.ACTION_MOVE://?按鈕移動時
????if?(isRecording)?{
????//?根據用戶移動的?xy的坐標判斷用戶是否想要取消當次語音發送
????Log.e("AudioRecorderButton",?"x="+x+"y="+y);
????if?(wantCancel(x,?y))?{
????changeState(STATE_WANT_CANEL);
????}?else?{
????changeState(STATE_RECRODING);
????}
????}?else?{//?提示錄音時間太短?
????}
????break;
case?MotionEvent.ACTION_UP://?按鈕松開時
????Log.e("AudioRecorderButton",?"已經松開-------x="+x+"y="+y);
????if?(mCurSTATE?==?STATE_RECRODING)?{//?是錄音
????mDialogManager.dimissDialog();
????}?else?if?(mCurSTATE?==?STATE_WANT_CANEL)?{//?想取消
????mDialogManager.dimissDialog();
????}
????reset();
break;
}
return?true;
}
/**
*?恢復狀態和標志位
*/
private?void?reset()?{
isRecording?=?false;
changeState(STATE_NORMAL);
}
private?boolean?wantCancel(int?x,?int?y)?{
if?(x?<?0?||?x?>?this.getWidth())?{//手指滑動已經超出按鈕
return?true;
}
if?(y?<?-DISTANCE_Y_CANCEL?||?y?>?DISTANCE_Y_CANCEL?+?getHeight())?{
return?true;
}
return?false;
}
private?void?changeState(int?CURRENT_STATE)?{
if?(CURRENT_STATE?!=?mCurSTATE)?{//?當前傳入狀態不等于當前默認狀態
mCurSTATE?=?CURRENT_STATE;
switch?(mCurSTATE)?{
case?STATE_NORMAL:
setBackgroundResource(R.drawable.but_recorder_normal);
setText(R.string.str_voice_normal);
break;
case?STATE_RECRODING:
setBackgroundResource(R.drawable.but_recording);
setText(R.string.str_voice_recording);
if?(isRecording)?{
?mDialogManager.recording();?
}
break;
case?STATE_WANT_CANEL:
setBackgroundResource(R.drawable.but_recording);
setText(R.string.str_voice_want_cancel);
mDialogManager.wantToCancel();
break;}}}}
2015-05-18
onTouchEvent()里面不能直接return true ,需要 return?super.onTouchEvent(event);
2015-05-21
好的 謝謝 我試試
2015-05-17
把onTouchEvent()的返回值改為super.onTouchEvent(event),再試試