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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。