当前位置: 首页 > news >正文

诸暨网站制作公司 网页南宁网络推广方案

诸暨网站制作公司 网页,南宁网络推广方案,网页qq登录保护不让用,网络设计专业有前途吗参考于#xff1a;Android模仿微信语音聊天功能#xff0c;这代码跑起来有问题#xff0c;自己改动了一下#xff0c;基本上没什么大问题先贴下效果图1、三个布局文件activity_main.xmldialog_manger.xmlitem_layout2.自定义的类(1)DialogMangerpackage com.nickming.view;…参考于Android模仿微信语音聊天功能这代码跑起来有问题自己改动了一下基本上没什么大问题先贴下效果图1、三个布局文件activity_main.xmldialog_manger.xmlitem_layout2.自定义的类(1)DialogMangerpackage com.nickming.view;import com.example.weixin_record.R;import android.app.Dialog;import android.content.Context;import android.graphics.drawable.AnimationDrawable;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageView;import android.widget.TextView;/**** ClassName: DialogManager* Description:对话框管理类* author: 张 维* date: 2016-5-23 下午4:56:03**/public class DialogManager {/*** 以下为dialog的初始化控件包括其中的布局文件*/private Dialog mDialog;private ImageView mIcon;private ImageView mVoice;private TextView mLable;private Context mContext;public DialogManager(Context context) {mContext context;}public void showRecordingDialog() {mDialog new Dialog(mContext,R.style.Theme_audioDialog);// 用layoutinflater来引用布局LayoutInflater inflater LayoutInflater.from(mContext);View view inflater.inflate(R.layout.dialog_manager, null);mDialog.setContentView(view);mIcon (ImageView) mDialog.findViewById(R.id.dialog_icon);mVoice (ImageView) mDialog.findViewById(R.id.dialog_voice);mVoice.setBackgroundResource(R.drawable.play02);AnimationDrawable drawable (AnimationDrawable) mVoice.getBackground();drawable.start();mLable (TextView) mDialog.findViewById(R.id.recorder_dialogtext);mDialog.show();}/*** 设置正在录音时的dialog界面*/public void recording() {if (mDialog ! null mDialog.isShowing()) {mIcon.setVisibility(View.VISIBLE);mVoice.setVisibility(View.VISIBLE);mLable.setVisibility(View.VISIBLE);mIcon.setImageResource(R.drawable.recorder);mLable.setText(R.string.shouzhishanghua);}}/*** 取消界面*/public void wantToCancel() {// TODO Auto-generated method stubif (mDialog ! null mDialog.isShowing()) {mIcon.setVisibility(View.VISIBLE);mVoice.setVisibility(View.GONE);mLable.setVisibility(View.VISIBLE);mIcon.setImageResource(R.drawable.cancel);mLable.setText(R.string.want_to_cancle);}}// 时间过短public void timeShort() {// TODO Auto-generated method stubif (mDialog ! null mDialog.isShowing()) {mIcon.setVisibility(View.VISIBLE);mVoice.setVisibility(View.GONE);mLable.setVisibility(View.VISIBLE);mIcon.setImageResource(R.drawable.voice_to_short);mLable.setText(R.string.timeshort);}}// 隐藏dialogpublic void dimissDialog() {// TODO Auto-generated method stubif (mDialog ! null mDialog.isShowing()) {mDialog.dismiss();mDialog null;}}public void updateVoiceLevel(int level) {// TODO Auto-generated method stubif (mDialog ! null mDialog.isShowing()) {//先不改变它的默认状态//mIcon.setVisibility(View.VISIBLE);//mVoice.setVisibility(View.VISIBLE);//mLable.setVisibility(View.VISIBLE);//通过level来找到图片的id也可以用switch来寻址但是代码可能会比较长int resId mContext.getResources().getIdentifier(v level,drawable, mContext.getPackageName());mVoice.setImageResource(resId);}}}(2)AudioRecordButtonpackage com.nickming.view;import com.example.weixin_record.R;import com.example.weixin_record.R.string;import com.nickming.view.AudioManager.AudioStageListener;import android.R.bool;import android.content.Context;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.Button;/**** ClassName: AudioRecordButton* Description:自定义的button按钮* author: 张 维* date: 2016-5-23 下午2:13:20**/public class AudioRecordButton extends Button implements AudioStageListener {private static final int STATE_NORMAL 1;private static final int STATE_RECORDING 2;private static final int STATE_WANT_TO_CANCEL 3;private static final int DISTANCE_Y_CANCEL 50;private int mCurrentState STATE_NORMAL;// 已经开始录音private boolean isRecording false;private DialogManager mDialogManager;private AudioManager mAudioManager;private float mTime 0;// 是否触发了onlongclick准备好了private boolean mReady;/*** 先实现两个参数的构造方法布局会默认引用这个构造方法* 用一个 构造参数的构造方法来引用这个方法 * param context*/public AudioRecordButton(Context context) {this(context, null);// TODO Auto-generated constructor stub}public AudioRecordButton(Context context, AttributeSet attrs) {super(context, attrs);mDialogManager new DialogManager(getContext());// 这里没有判断储存卡是否存在有空要判断String dir Environment.getExternalStorageDirectory() /temp;mAudioManager AudioManager.getInstance(dir);mAudioManager.setOnAudioStageListener(this);setOnLongClickListener(new OnLongClickListener() {Overridepublic boolean onLongClick(View v) {// TODO Auto-generated methodmReady true;mAudioManager.prepareAudio();return false;}});}/*** 录音完成后的回调回调给activiy可以获得mtime和文件的路径* author nickming**/public interface AudioFinishRecorderListener{void onFinished(float mtime,String filePath);}private AudioFinishRecorderListener mListener;public void setAudioFinishRecorderListener(AudioFinishRecorderListener listener){mListenerlistener;}// 获取音量大小的runnableprivate Runnable mGetVoiceLevelRunnable new Runnable() {Overridepublic void run() {// TODO Auto-generated method stubwhile (isRecording) {try {Thread.sleep(100);mTime 0.1f;mhandler.sendEmptyMessage(MSG_VOICE_CHANGE);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}};// 准备三个常量private static final int MSG_AUDIO_PREPARED 0X110;private static final int MSG_VOICE_CHANGE 0X111;private static final int MSG_DIALOG_DIMISS 0X112;private Handler mhandler new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case MSG_AUDIO_PREPARED:// 显示应该是在audio end prepare之后回调mDialogManager.showRecordingDialog();isRecording true;new Thread(mGetVoiceLevelRunnable).start();// 需要开启一个线程来变换音量break;case MSG_VOICE_CHANGE:mDialogManager.updateVoiceLevel(mAudioManager.getVoiceLevel(7));break;case MSG_DIALOG_DIMISS:break;}};};// 在这里面发送一个handler的消息Overridepublic void wellPrepared() {// TODO Auto-generated method stubmhandler.sendEmptyMessage(MSG_AUDIO_PREPARED);}/*** 直接复写这个监听函数*/Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubint action event.getAction();int x (int) event.getX();int y (int) event.getY();switch (action) {case MotionEvent.ACTION_DOWN://表示用户开始触摸.changeState(STATE_RECORDING);break;case MotionEvent.ACTION_MOVE://表示用户在移动(手指或者其他)if (isRecording) {// 根据xy来判断用户是否想要取消if (wantToCancel(x, y)) {changeState(STATE_WANT_TO_CANCEL);} else {changeState(STATE_RECORDING);}}break;case MotionEvent.ACTION_UP://表示用户抬起了手指// 首先判断是否有触发onlongclick事件没有的话直接返回resetif (!mReady) {reset();return super.onTouchEvent(event);}// 如果按的时间太短还没准备好或者时间录制太短就离开了则显示这个dialogif (!isRecording || mTime 0.6f) {mDialogManager.timeShort();//取消对话框mAudioManager.cancel();mhandler.sendEmptyMessageDelayed(MSG_DIALOG_DIMISS, 1300);// 持续1.3s} else if (mCurrentState STATE_RECORDING) {//正常录制结束mDialogManager.dimissDialog();mAudioManager.release();// release释放一个mediarecorderif (mListener!null) {// 并且callbackActivity保存录音mListener.onFinished(mTime, mAudioManager.getCurrentFilePath());}} else if (mCurrentState STATE_WANT_TO_CANCEL) {// cancelmAudioManager.cancel();mDialogManager.dimissDialog();}reset();// 恢复标志位break;}return super.onTouchEvent(event);}/*** 回复标志位以及状态*/private void reset() {// TODO Auto-generated method stubisRecording false;changeState(STATE_NORMAL);mReady false;mTime 0;}private boolean wantToCancel(int x, int y) {// 超过按钮的宽度if (x 0 || x getWidth()) {// 判断是否在左边右边上边下边return true;}// 超过按钮的高度if (y -DISTANCE_Y_CANCEL || y getHeight() DISTANCE_Y_CANCEL) {return true;}return false;}private void changeState(int state) {if (mCurrentState ! state) {mCurrentState state;switch (mCurrentState) {case STATE_NORMAL:setBackgroundResource(R.drawable.button_recordnormal);setText(R.string.normal);break;case STATE_RECORDING:setBackgroundResource(R.drawable.button_recording);setText(R.string.recording);if (isRecording) {mDialogManager.recording();// 复写dialog.recording();}break;case STATE_WANT_TO_CANCEL:setBackgroundResource(R.drawable.button_recording);setText(R.string.want_to_cancle);// 取消mDialogManager.wantToCancel();break;}}}Overridepublic boolean onPreDraw() {return false;}}(3)MediaRecorderpackage com.nickming.view;import java.io.File;import java.io.IOException;import java.util.UUID;import android.media.MediaRecorder;/**** ClassName: AudioManager* Description: 录音的管理类(准备工作)* author: 张 维* date: 2016-5-23 下午2:10:35**/public class AudioManager {private MediaRecorder mRecorder;private String mDirString;private String mCurrentFilePath;private boolean isPrepared;// 是否准备好了/*** 单例化的方法* 1 先声明一个static 类型的变量a* 2 在声明默认的构造函数* 3 再用public synchronized static* 类名 getInstance() { if(anull) { anew 类();} return a; } 或者用以下的方法*//*** 单例化这个类*/private static AudioManager mInstance;private AudioManager(String dir) {mDirStringdir;}public static AudioManager getInstance(String dir) {if (mInstance null) {synchronized (AudioManager.class) {if (mInstance null) {mInstance new AudioManager(dir);}}}return mInstance;}/*** 回调函数准备完毕准备好后button才会开始显示录音框** author nickming**/public interface AudioStageListener {void wellPrepared();}public AudioStageListener mListener;public void setOnAudioStageListener(AudioStageListener listener) {mListener listener;}// 准备方法public void prepareAudio() {try {// 一开始应该是false的isPrepared false;File dir new File(mDirString);//判断对象file是否存在if (!dir.exists()) {//创建此抽象路径指定的目录包括所有必须但不存在的父目录。(及可以创建多级目录无论是否存在父目录)dir.mkdirs();}String fileNameString generalFileName();File file new File(dir, fileNameString);mCurrentFilePath file.getAbsolutePath();mRecorder new MediaRecorder();// 设置输出文件mRecorder.setOutputFile(file.getAbsolutePath());// 设置meidaRecorder的音频源是麦克风mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置文件音频的输出格式为amrmRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);// 设置音频的编码格式为amrmRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 严格遵守google官方api给出的mediaRecorder的状态流程图mRecorder.prepare();mRecorder.start();// 准备结束isPrepared true;// 已经准备好了可以录制了if (mListener ! null) {mListener.wellPrepared();}} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 随机生成文件的名称** return*/private String generalFileName() {//UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。return UUID.randomUUID().toString() .amr;}// 获得声音的大小public int getVoiceLevel(int maxLevel) {// mRecorder.getMaxAmplitude()这个是音频的振幅范围值域是1-32767if (isPrepared) {try {// 取证1否则去不到7return maxLevel * mRecorder.getMaxAmplitude() / 32768 1;} catch (Exception e) {}}return 1;}// 释放资源public void release() {// 严格按照api流程进行mRecorder.stop();mRecorder.release();mRecorder null;}// 取消,因为prepare时产生了一个文件所以cancel方法应该要删除这个文件// 这是与release的方法的区别public void cancel() {release();if (mCurrentFilePath ! null) {File file new File(mCurrentFilePath);file.delete();//删除文件mCurrentFilePath null;}}public String getCurrentFilePath() {return mCurrentFilePath;}}3.调用的类(1)RecorderAdapterpackage com.example.weixin_record;import java.util.List;import com.example.weixin_record.MainActivity.Recorder;import android.content.Context;import android.util.DisplayMetrics;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.ArrayAdapter;import android.widget.TextView;/**** ClassName: RecorderAdapter* Description:list的适配器* author: 张 维* date: 2016-5-23 下午4:04:02**/public class RecorderAdapter extends ArrayAdapter {private LayoutInflater inflater;private int mMinItemWith;// 设置对话框的最大宽度和最小宽度private int mMaxItemWith;public RecorderAdapter(Context context, List dataList) {super(context, -1, dataList);inflater LayoutInflater.from(context);// 获取系统宽度WindowManager wManager (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics outMetrics new DisplayMetrics();wManager.getDefaultDisplay().getMetrics(outMetrics);mMaxItemWith (int) (outMetrics.widthPixels * 0.7f);mMinItemWith (int) (outMetrics.widthPixels * 0.15f);}Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder null;if (convertView null) {convertView inflater.inflate(R.layout.item_layout, parent, false);viewHoldernew ViewHolder();viewHolder.seconds(TextView) convertView.findViewById(R.id.recorder_time);viewHolder.lengthconvertView.findViewById(R.id.recorder_length);convertView.setTag(viewHolder);}else {viewHolder(ViewHolder) convertView.getTag();}viewHolder.seconds.setText(Math.round(getItem(position).time));ViewGroup.LayoutParams lParamsviewHolder.length.getLayoutParams();lParams.width(int) (mMinItemWithmMaxItemWith/60f*getItem(position).time);viewHolder.length.setLayoutParams(lParams);return convertView;}class ViewHolder {TextView seconds;// 时间View length;// 对话框长度}}(2)MediaManagerpackage com.example.weixin_record;import java.io.IOException;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaPlayer.OnErrorListener;import android.util.Log;/**** ClassName: MediaManager* Description:播放的管理类* author: 张 维* date: 2016-5-23 下午4:04:43**/public class MediaManager {private static MediaPlayer mPlayer;private static boolean isPause;public static void playSound(String filePathString,OnCompletionListener onCompletionListener) {if (mPlayernull) {mPlayernew MediaPlayer();//保险起见设置报错监听mPlayer.setOnErrorListener(new OnErrorListener() {Overridepublic boolean onError(MediaPlayer mp, int what, int extra) {Log.i(info, );mPlayer.reset();return false;}});}else {mPlayer.reset();//就回复}try {mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mPlayer.setOnCompletionListener(onCompletionListener);mPlayer.setDataSource(filePathString);mPlayer.prepare();mPlayer.start();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//停止函数public static void pause(){if (mPlayer!nullmPlayer.isPlaying()) {mPlayer.pause();isPausetrue;}}//继续public static void resume(){if (mPlayer!nullisPause) {mPlayer.start();isPausefalse;}}public static void release(){if (mPlayer!null) {mPlayer.release();mPlayernull;}}}(3)MainActivitypackage com.example.weixin_record;import java.util.ArrayList;import java.util.List;import com.nickming.view.AudioRecordButton;import com.nickming.view.AudioRecordButton.AudioFinishRecorderListener;import android.app.Activity;import android.graphics.drawable.AnimationDrawable;import android.media.MediaPlayer;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {AudioRecordButton button;private ListView mlistview;private ArrayAdapter mAdapter;private View viewanim;private List mDatas new ArrayList();Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mlistview (ListView) findViewById(R.id.listview);button (AudioRecordButton) findViewById(R.id.recordButton);button.setAudioFinishRecorderListener(new AudioFinishRecorderListener() {Overridepublic void onFinished(float seconds, String filePath) {// TODO Auto-generated method stubRecorder recorder new Recorder(seconds, filePath);mDatas.add(recorder);mAdapter.notifyDataSetChanged();mlistview.setSelection(mDatas.size() - 1);}});mAdapter new RecorderAdapter(this, mDatas);mlistview.setAdapter(mAdapter);mlistview.setOnItemClickListener(new OnItemClickListener() {Overridepublic void onItemClick(AdapterView parent, View view,int position, long id) {// 播放动画if (viewanim!null) {//让第二个播放的时候第一个停止播放viewanim.setBackgroundResource(R.drawable.adj);viewanimnull;}viewanim view.findViewById(R.id.show_anim01);viewanim.setBackgroundResource(R.drawable.play);AnimationDrawable drawable (AnimationDrawable) viewanim.getBackground();drawable.start();// 播放音频Log.i(info, positionposition);MediaManager.playSound(mDatas.get(position).filePathString,new MediaPlayer.OnCompletionListener() {Overridepublic void onCompletion(MediaPlayer mp) {viewanim.setBackgroundResource(R.drawable.adj);}});}});}Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();MediaManager.pause();}Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();MediaManager.resume();}Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();MediaManager.release();}class Recorder {float time;String filePathString;public Recorder(float time, String filePathString) {super();this.time time;this.filePathString filePathString;}public float getTime() {return time;}public void setTime(float time) {this.time time;}public String getFilePathString() {return filePathString;}public void setFilePathString(String filePathString) {this.filePathString filePathString;}}}
http://www.zqtcl.cn/news/66509/

相关文章:

  • 设计网站意味着什么一个后台可以做几个网站
  • 现在建设网站都用什么软件下载wordpress首页调用二级分类文章
  • 怎样搭建个人网站手机搜索网站建设
  • 湖南地税局官网站水利建设基金Wordpress写文章贴代码
  • 电商网站分析阿里云个人网站建设书
  • 申请网站就是做网站吗全国工商企业信息查询网
  • 孔夫子旧书网网站谁做的锋创科技园网站建设
  • 有做网站需求的客户服务型网站建设的主题
  • 资料库网站开发报价深圳品牌网站
  • 西安学校网站建设多少钱免费好用的云电脑
  • 进入山东省住房和城乡建设厅网站济南mip网站建设公司
  • 网站建设工资郑州wordpress 手机端优化
  • ps做网站画布大小是多少龙岩微信小程序定制
  • wordpress 创建子主题关键词优化seo多少钱一年
  • 退工在那个网站上做餐饮网站界面
  • 9.9网站怎么做三明企业网站建设
  • 用vs2010做的网站的源码html代码特效
  • 高级网站开发培训邯郸网站建设品牌公司
  • 营销类网站建设如何做收费会员定制网站
  • 寺庙网站开发建设方案$post wordpress
  • 营销型网站头部布局的元素微信名片制作小程序
  • 网站建设的技术保证怎么写wordpress 黑链
  • 什么是外包seo网站优化专家
  • 布吉网站建设公司h5 和手机网站
  • wang域名建的网站最新新闻热点大事件
  • 免费的cms视频网站模板长沙做网站排名
  • 网站正在建设中模板下载建设工程施工合同名词解释
  • 毕业设计做视频网站php做网站要多久
  • 公司申请网站建设申请理由如何进行网站运营与规划
  • 房地产网站建设公司猪八戒网做网站被骗