Android自定义View实现微信语音界面
前言
因为最近的项目需要使用录音功能,开始的想法是Button+OnTouchListener+Dialog实现,在大部分手机中都没问题,只有MI8会偶尔无法触发MotionEvent.ACTION_UP,导致程序异常。所以就自己写了个自定义View来实现,主要也是通过监听
OnTouchListener+Dialog来实现。这里只实现了自定义View,并不涉及录音和播放。效果图如下:
代码
代码并不复杂,配合注释应该很容易理解。
/**
*Author:BlackHao
*Time:2019/4/1814:03
*Description:自定义录音按钮布局界面
*/
publicclassPressedViewextendsViewimplementsView.OnTouchListener{
privateintnormalRes;
privateStringnormalText="";
privateintpressedRes;
privateStringpressedText="";
//
privatePaintpaint;
privateRectrect;
//当前是否是按下状态
privatebooleanisPressed=false;
//
privatePressCallbackcallback;
//按下的位置y坐标
privateintpressedY=0;
//当前是否是outSize
privatebooleanisOutSize=false;
//字体dp大小
privatestaticintTEXT_SIZE=20;
//对话框相关
privateDialogsoundVolumeDialog=null;
//音量图片
privateImageViewsoundVolumeImg=null;
//对话框背景
privateRelativeLayoutsoundVolumeLayout=null;
publicPressedView(Contextcontext){
super(context);
init();
}
publicPressedView(Contextcontext,@NullableAttributeSetattrs){
super(context,attrs);
init();
}
publicPressedView(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
init();
}
privatevoidinit(){
//
paint=newPaint();
paint.setAntiAlias(true);
paint.setTextSize(DensityUtil.dip2px(getContext(),TEXT_SIZE));
paint.setColor(Color.WHITE);
rect=newRect();
//
normalRes=R.drawable.blue_btn_bk;
normalText="按住说话";
pressedRes=R.drawable.red_btn_bk;
pressedText="松开结束";
//
setOnTouchListener(this);
//
initSoundVolumeDlg();
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
rect.set(0,0,getWidth(),getHeight());
if(!isPressed){
setBackgroundResource(normalRes);
drawTextOnRect(canvas,rect,normalText);
}else{
setBackgroundResource(pressedRes);
drawTextOnRect(canvas,rect,pressedText);
}
}
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
pressedY=(int)event.getRawY();
isOutSize=false;
if(!isPressed){
isPressed=true;
postInvalidate();
if(callback!=null){
//回调
callback.onStartRecord();
//按下,弹出对话框
soundVolumeImg.setImageResource(R.mipmap.sound_volume_01);
soundVolumeImg.setVisibility(View.VISIBLE);
soundVolumeLayout.setBackgroundResource(R.mipmap.sound_volume_default_bk);
soundVolumeDialog.show();
}
}
break;
caseMotionEvent.ACTION_UP:
if(isPressed){
isPressed=false;
postInvalidate();
if(callback!=null){
intupY=(int)event.getRawY();
if(pressedY-upY200.0&&voiceValue<600){
soundVolumeImg.setImageResource(R.mipmap.sound_volume_02);
}elseif(voiceValue>600.0&&voiceValue<1200){
soundVolumeImg.setImageResource(R.mipmap.sound_volume_03);
}elseif(voiceValue>1200.0&&voiceValue<2400){
soundVolumeImg.setImageResource(R.mipmap.sound_volume_04);
}elseif(voiceValue>2400.0&&voiceValue<10000){
soundVolumeImg.setImageResource(R.mipmap.sound_volume_05);
}elseif(voiceValue>10000.0&&voiceValue<28000.0){
soundVolumeImg.setImageResource(R.mipmap.sound_volume_06);
}elseif(voiceValue>28000.0){
soundVolumeImg.setImageResource(R.mipmap.sound_volume_07);
}
}
}
结语
源码github地址:仿微信语音界面
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。