解决android 长按语音操作 弹出语音层 点击其他的按钮会影响语音层的时间


在做即时通讯的聊天界面的时候, 当我长按语音的按钮的时候, 就像微信中的开发界面一样 出现一个语音的弹层 显示语音正在录制的过程中。 

但是当我点击其他按钮的时候,往往出现事件的混乱传播。 

  研究了一上午的时间, 发现微信从现象中没有出现点击其他的按钮的时候,影响弹层的效果。 在其他的即时通讯聊天界面的源码中都频频的出现这个情况。 

其中一个源码没有出现这个情况, 他的解决思路是: 在当前的界面中重写onTouchEvent 事件, 根据点击的位置 以及 长按的按钮的view 的大小范围进行定位确定的。

但是这样的 当我在listView 中添加 onTouchEvent事件的时候, 我还有从全局上进行考虑。 

现在给我探索的其他的方法: 

    当我长按语音view 的时候。在处理 onTouchListener 方法的时候。 添加了& MotionEvent.ACTION_MASK 同时在处理事件的时候,添加了多指的操作。

 第二根手指按下的时候的操作。


     //第二根手指按下  
            case MotionEvent.ACTION_POINTER_DOWN:  
           return true;
            case MotionEvent.ACTION_POINTER_UP:  
            return true;



直接上代码 : 



class PressToSpeakListen implements View.OnTouchListener {
@SuppressLint({ "ClickableViewAccessibility", "Wakelock" })

@Override
public boolean onTouch(View v, MotionEvent event) {
boolean isCutVoice = false;
//获取说话位置的点击事件
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
//在这个点击的位置

btn_upload_view.setClickable(false);
btn_model_edit.setClickable(false);
btn_upload_view.setBackgroundResource(ResourceUtils
.getIdByName(SobotChatActivity.this, "drawable",
"picture_pressed"));
btn_model_edit
.setBackgroundResource(ResourceUtils.getIdByName(
SobotChatActivity.this, "drawable",
"keyboard_pressed"));
stopVoiceTimeTask();
v.setPressed(true);
voice_time_long.setText("00" + "''");
voiceTimeLongStr = "00";
voiceTimerLong = 0;
currentVoiceLong = 0;
recording_container.setVisibility(View.VISIBLE);
voice_top_image.setVisibility(View.VISIBLE);
mic_image.setVisibility(View.VISIBLE);
mic_image_animate.setVisibility(View.VISIBLE);
voice_time_long.setVisibility(View.VISIBLE);
recording_timeshort.setVisibility(View.GONE);
image_endVoice.setVisibility(View.GONE);
txt_speak_content.setText("松开 发送");
// 设置语音的定时任务


mic_image_animate.setImageResource(ResourceUtils.getIdByName(
SobotChatActivity.this, "drawable", "voice_animation"));
animationDrawable = (AnimationDrawable) mic_image_animate
.getDrawable();
animationDrawable.start();
recording_hint
.setText(getString(ResourceUtils.getIdByName(
SobotChatActivity.this, "string",
"move_up_to_cancel")));
recording_hint.setBackgroundColor(Color.GRAY);


LogUtils.i("录音Action     Down---");
startVoice();
// restartMyTimeTask(handler);
return true;


     //第二根手指按下  
            case MotionEvent.ACTION_POINTER_DOWN:  
           return true;
            case MotionEvent.ACTION_POINTER_UP:  
            return true;


case MotionEvent.ACTION_MOVE: {
if (is_startCustomTimerTask == false) {
noReplyTimeUserInfo = 0;
}
// restartMyTimeTask(handler);
if (event.getY() < 10) {
// 取消界面的显示
voice_top_image.setVisibility(View.GONE);
image_endVoice.setVisibility(View.VISIBLE);
mic_image.setVisibility(View.GONE);
mic_image_animate.setVisibility(View.GONE);
recording_timeshort.setVisibility(View.GONE);
txt_speak_content.setText("松开手指 取消发送");
// 停止语音的播放时间
mic_image_animate.setImageResource(ResourceUtils
.getIdByName(SobotChatActivity.this, "drawable",
"voice_animation"));
animationDrawable = (AnimationDrawable) mic_image_animate
.getDrawable();
animationDrawable.start();
recording_hint.setText(getString(ResourceUtils.getIdByName(
SobotChatActivity.this, "string",
"release_to_cancel")));
recording_hint.setBackgroundResource(ResourceUtils
.getIdByName(SobotChatActivity.this, "drawable",
"recording_text_hint_bg"));
} else {



txt_speak_content.setText("松开 发送");
voice_top_image.setVisibility(View.VISIBLE);
mic_image_animate.setVisibility(View.VISIBLE);
mic_image_animate.setImageResource(ResourceUtils
.getIdByName(SobotChatActivity.this, "drawable",
"voice_animation"));
animationDrawable = (AnimationDrawable) mic_image_animate
.getDrawable();
animationDrawable.start();
image_endVoice.setVisibility(View.GONE);
mic_image.setVisibility(View.VISIBLE);
recording_timeshort.setVisibility(View.GONE);
recording_hint.setText(getString(ResourceUtils.getIdByName(
SobotChatActivity.this, "string",
"move_up_to_cancel")));
recording_hint.setBackgroundColor(Color.GRAY);
// 录音的时间超过一分钟的时间切断进行发送语音
if (voiceTimerLong > 60 * 1000) {
isCutVoice = true;
voiceCuttingMethod();
voiceTimerLong = 0;
// recording_container.setVisibility(View.VISIBLE);
// voice_top_image.setVisibility(View.VISIBLE);
recording_hint.setText("语音不能太长");
recording_timeshort.setVisibility(View.VISIBLE);
mic_image.setVisibility(View.GONE);
mic_image_animate.setVisibility(View.GONE);
closeVoiceWindows();
v.setPressed(false);
// restartMyTimeTask(handler);
currentVoiceLong = 0;
}
}
return true;
}
case MotionEvent.ACTION_UP:
// 手指抬起的操作
btn_upload_view.setClickable(true);
btn_model_edit.setClickable(true);
btn_upload_view.setBackgroundResource(ResourceUtils
.getIdByName(SobotChatActivity.this, "drawable",
"picture_normal"));
btn_model_edit.setBackgroundResource(ResourceUtils.getIdByName(
SobotChatActivity.this, "drawable", "keyboard_normal"));
v.setPressed(false);
txt_speak_content.setText("按住 说话");
stopVoiceTimeTask();
stopVoice();
if (recording_container.getVisibility() == View.VISIBLE
&& !isCutVoice) {
moreFunction.setVisibility(View.GONE);
animationDrawable.stop();
LogUtils.i("录音Action     up---");
voice_time_long.setText("00" + "''");
voice_time_long.setVisibility(View.INVISIBLE);
if (event.getY() < 0) {
recording_container.setVisibility(View.GONE);
return true;
// 取消发送语音
} else {
// 发送语音
if (currentVoiceLong < 1 * 1000) {
LogUtils.i("asfafdas时间不能少于一秒钟" + currentVoiceLong);
// recording_container.setVisibility(View.VISIBLE);
voice_top_image.setVisibility(View.VISIBLE);
recording_hint.setText("语音不能少于一秒钟");
recording_timeshort.setVisibility(View.VISIBLE);
mic_image.setVisibility(View.GONE);
mic_image_animate.setVisibility(View.GONE);
} else if (currentVoiceLong < 60 * 1000) {
recording_container.setVisibility(View.GONE);
sendVoiceMap();
//return true;
} else if (currentVoiceLong > 60 * 1000) {
LogUtils.i("时间不能大于60秒");
voice_top_image.setVisibility(View.VISIBLE);
recording_hint.setText("语音不能太长");
recording_timeshort.setVisibility(View.VISIBLE);
mic_image.setVisibility(View.GONE);
mic_image_animate.setVisibility(View.GONE);
}
}
currentVoiceLong = 0;
closeVoiceWindows();
}
voiceTimerLong = 0;
restartMyTimeTask(handler);
// mFileName
return true;
default:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
Message message = handler.obtainMessage();
message.what = ZhiChiConstant.hander_close_voice_view;
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
recording_container.setVisibility(View.GONE);
}
}
}).start();
return true;
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,当点击录音按钮并希望切换布局以发送语音消息时,你可以通过以下步骤实现: 1. 在XML布局文件中添加两种布局,一种用于显示录音按钮,另一种用于显示录音界面。你可以使用LinearLayout或RelativeLayout等布局容器来放置这两个布局。 2. 使用findViewById()方法在Activity中找到这两个布局,并使用setVisibility(View.VISIBLE)和setVisibility(View.GONE)方法来控制它们的可见性。初始时,录音按钮布局可见,录音界面布局不可见。 3. 当点击录音按钮时,在按钮点击事件中,通过setVisibility(View.VISIBLE)将录音界面布局设置为可见,并将录音按钮布局设置为不可见。同时,你还可以在这里控制其他布局元素的可见性,例如隐藏底部导航栏。 4. 录音界面布局可以包含录音按钮、停止按钮、暂停按钮、录制计时器等元素。你可以使用ImageView或Button来作为按钮,用TextView来显示计时器。 5. 在录音按钮点击事件中,通过MediaRecorder类来实现录音功能,并在适当的时候启动计时器。你可以使用setOnTouchListener()方法来监听按钮的触摸事件,以便在用户按下按钮时开始录音,在用户松开按钮时停止录音。 6. 当录音完成后,你可以将录音文件发送到服务器或保存到本地,根据你的业务需求来选择合适的处理方式。 通过以上步骤,当点击录音按钮时,你就可以实现在Android中切换布局以发送语音消息的功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值