首页>代码>android 画模拟示波器>/AnalogOscilloscope/src/com/shine/analogoscilloscope/MainActivity.java
package com.shine.analogoscilloscope;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ZoomControls;
public class MainActivity extends Activity {
    /** Called when the activity is first created. */
	private final int MENU_ABOUT = Menu.FIRST;
    private final int MENU_EXIT = Menu.FIRST+1;
    private final int MENU_SET= Menu.FIRST+2;
    private final int DIALOG_ABOUT = 1;
    private final int DIALOG_SETUP = 2;
        Button btnStart,btnExit;
        SurfaceView sfv;
    ZoomControls zctlX,zctlY;
    
    ClsOscilloscope clsOscilloscope=new ClsOscilloscope();
    
        static int frequency = 8000;//分辨率
    	//static final int frequency = 44100;//分辨率
        static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
        static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
        static final int xMax = 25;//X轴缩小比例最大值,X轴数据量巨大,容易产生刷新延时
        static final int xMin = 1;//X轴缩小比例最小值
        static final int yMax = 100;//Y轴缩小比例最大值
        static final int yMin = 1;//Y轴缩小比例最小值
        private TextView textx;
        private TextView texty;
        Button button_xadd;
        Button button_xcut;
        Button button_yadd;
        Button button_ycut;
        
        int recBufSize;//录音最小buffer大小
        AudioRecord audioRecord;
        Paint mPaint;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
                //按键
                btnStart = (Button) this.findViewById(R.id.btnStart);
                btnStart.setOnClickListener(new ClickEvent());
                btnExit = (Button) this.findViewById(R.id.btnExit);
                btnExit.setOnClickListener(new ClickEvent());
                //画板和画笔
                sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01); 
                sfv.setOnTouchListener(new TouchEvent());
                textx = (TextView)this.findViewById(R.id.textX);
		        texty = (TextView)this.findViewById(R.id.textY);
		        button_xadd = (Button)this.findViewById(R.id.buttonx1);
		        button_xcut = (Button)this.findViewById(R.id.buttonx2);
		        button_yadd = (Button)this.findViewById(R.id.buttony1);
		        button_ycut = (Button)this.findViewById(R.id.buttony2);
		        mPaint = new Paint();  
		        mPaint.setColor(Color.GREEN);// 画笔为绿色  
		        mPaint.setStrokeWidth(1);// 设置画笔粗细 
		        //示波器类库
		        clsOscilloscope.initOscilloscope(xMin, yMax/2, sfv.getHeight()/2);
		        //====================================================================
		        //为XY轴缩放按钮绑定监听事件
		        button_xcut.setOnClickListener(new OnClickListener(){

					@Override
					public void onClick(View arg0) {
						// TODO Auto-generated method stub
						 if(clsOscilloscope.rateX>xMin)
							 clsOscilloscope.rateX--;
						 textx.setText("X轴增加"+String.valueOf(xMax-clsOscilloscope.rateX+1)+"倍");
					}});
		        button_xadd.setOnClickListener(new OnClickListener(){

					@Override
					public void onClick(View arg0) {
						// TODO Auto-generated method stub
                                if(clsOscilloscope.rateX<xMax)
                                        clsOscilloscope.rateX++;
                          textx.setText("X轴增加"+String.valueOf(xMax-clsOscilloscope.rateX+1)+"倍");
                        }
                });
		        button_ycut.setOnClickListener(new OnClickListener(){

					@Override
					public void onClick(View arg0) {
						// TODO Auto-generated method stub
                                if(clsOscilloscope.rateY>yMin)
                                        clsOscilloscope.rateY--;
                                texty.setText("Y轴增加"+String.valueOf(yMax-clsOscilloscope.rateY+1)+"倍");
                        }
                });
		        button_yadd.setOnClickListener(new OnClickListener(){

					@Override
					public void onClick(View arg0) {
						// TODO Auto-generated method stub
                                if(clsOscilloscope.rateY<yMax)
                                        clsOscilloscope.rateY++;        
                                texty.setText("Y轴增加"+String.valueOf(yMax-clsOscilloscope.rateY+1)+"倍");
                        }
                });
		        //=================================================================================
    }
        @Override
        protected void onDestroy() {
                super.onDestroy();
                clsOscilloscope.Stop();
                //android.os.Process.killProcess(android.os.Process.myPid());
        }
        
        /**
         * 按键事件处理
         * @author GV
         *
         */
        class ClickEvent implements View.OnClickListener {
                @Override
                public void onClick(View v) {
                        if (v == btnStart) {//开始
                            //录音组件
                            recBufSize = AudioRecord.getMinBufferSize(frequency,
                                            channelConfiguration, audioEncoding);
                            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,
                                            channelConfiguration, audioEncoding, recBufSize);
                            clsOscilloscope.baseLine=sfv.getHeight()/2;
                            clsOscilloscope.Start(audioRecord,recBufSize,sfv,mPaint);
                            Toast.makeText(getApplicationContext(), "ok!", Toast.LENGTH_SHORT).show();
                        } 
                        else if (v == btnExit)
                        {//停止
                                clsOscilloscope.Stop();
                        }
                }
        }
        /**
         * 触摸屏动态设置波形图基线
         * @author GV
         *
         */
        class TouchEvent implements OnTouchListener{
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                        clsOscilloscope.baseLine=(int)event.getY();
                        return true;
                }
                
        }
        //重写对话框服务程序
	    @Override
	    protected Dialog onCreateDialog (int id) {
	        switch (id) {
	        case DIALOG_ABOUT:
	            return new AlertDialog.Builder(this)
	                .setIcon(R.drawable.about_info)
	                .setTitle("关于")
	                .setMessage("       模拟语音示波器\n" +
	                		    "          Just do it!\n" +
	                		    "胖大星!让我们一起去抓水母吧!")
	                .setPositiveButton("确定", null)
	                .create();
	        case DIALOG_SETUP:
	            return new AlertDialog.Builder(this).setTitle("抽样频率选择")
	            .setIcon(android.R.drawable.ic_dialog_info)
	            .setSingleChoiceItems(new String[] { "采样频率为8000Hz", "采样频率为4100Hz" }, 0,
				new DialogInterface.OnClickListener() 
	            {
					public void onClick(DialogInterface dialog, int which) 
					{
						if(which==0)
						{
							//===================
							frequency = 8000;
					        //===================
						}
						else 
						{
							//===================
							frequency = 44100;
					        //===================
						}
					}
					
				})
				.setPositiveButton("确定", null).show();
	            
	        default:
	            return null;
	        }
	    }
	    //重写菜单设置服务函数
	    @Override
	    public boolean onCreateOptionsMenu(Menu menu) {
	        menu.add(0,MENU_ABOUT,0,"关于")
	            .setIcon(R.drawable.about);
	        menu.add(0,MENU_SET,0,"设置")
        	.setIcon(R.drawable.setup);
	        menu.add(0,MENU_EXIT,0,"退出")
	        	.setIcon(R.drawable.exit);
	        return true;
	    }
	  //重写菜单选择响应服务函数
	    @Override
	    public boolean onOptionsItemSelected(MenuItem item) {

	        switch(item.getItemId()) {
	        case MENU_ABOUT:
	            showDialog(DIALOG_ABOUT);
	            break;
	        case MENU_SET:
	        	showDialog(DIALOG_SETUP);
	        	break;
	        case MENU_EXIT:
                finish();//退出程序
	        	break;
	        default:
	            break;
	        }
        	//Toast.makeText(getApplicationContext(), "Frequency:"+frequency+"Hz",Toast.LENGTH_SHORT).show();
	        return false;
	    }
        
}
最近下载更多
lvjiang123  LV1 2021年5月22日
赵赵赵赵赵赵赵  LV1 2020年6月19日
z214658597  LV1 2019年4月13日
wqs-manson  LV1 2019年3月11日
lzyChina  LV1 2017年8月4日
jerry_xie_cn  LV1 2017年7月20日
yy1069442142  LV1 2017年7月14日
saijirihu1234  LV9 2017年6月28日
SiriusYZZ  LV3 2017年5月29日
rengle  LV1 2017年5月24日
最近浏览更多
LITIANYU084414  LV11 2023年1月13日
wengzheng007  LV1 2022年11月22日
zhendong  LV7 2022年9月25日
张恺祺  LV6 2022年5月21日
萌了个乖乖  LV12 2022年5月20日
GZW012345  LV8 2022年5月15日
dangzhiyuan012  LV12 2022年3月17日
lqf123  LV9 2021年6月14日
lvjiang123  LV1 2021年5月22日
lczd888  LV9 2021年5月8日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友