无线遥控小车android客户端图展

主界面:


设置界面:


使用界面:

(由于这不是真正的演示,所以背景是黑色的,如果连上背景是视频头拍摄到的图像)



主要代码:

MyVideo:

(注意这里没有对socket连接的状态进行判断,所以连接失败后点击按钮程序会退出,解决方法请参考我的智能家居项目的安卓应用)

package cn.dong.mycar;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URL;
import java.util.Scanner;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
 * @author by dong
 * function 发送指令
 */

public class MyVideo extends Activity{
	private Button ForWard;
	private Button BackWard;
	private Button TurnLeft;
	private Button TurnRight;
	private TextView showSpace;
	private Socket socket = null;
    PrintWriter mPrintWriterClient;
    
	URL videoUrl;
	
	SharedPreferences sharedPreferences;
	
	private String ipstr = null;
    private String portstr = null;
    private String forWordStr = null;
    private String backWordStr = null;
    private String leftStr = null;
    private String rightStr = null;
//    private String stopstr = null;
    private String videostr = null;
	
	MySurfaceView view;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        		WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.myvideo);
		
		//获取parameter中的内容
		sharedPreferences = getSharedPreferences("parameter", MODE_PRIVATE);
		videostr = sharedPreferences.getString("video", null);
		ipstr = sharedPreferences.getString("ip", null);
		portstr = sharedPreferences.getString("port", null);
		forWordStr = sharedPreferences.getString("up", null);
		backWordStr = sharedPreferences.getString("down", null);
		leftStr = sharedPreferences.getString("left", null);
		rightStr = sharedPreferences.getString("right", null);
//		stopstr = sharedPreferences.getString("stop", null);
		
		//把SOCKET放在线程里面
		new Thread(){
    		public void run() {
    			try {
//    				mSocketClient = new Socket("192.168.8.1", 2001);
    				socket=new Socket(ipstr, Integer.parseInt(portstr));
                    while(true){
                    	//发
                        mPrintWriterClient = new PrintWriter(new BufferedWriter(
								new OutputStreamWriter(socket.getOutputStream())), true);
//                    	//收
                        Scanner scan = new Scanner(socket.getInputStream());
                        String ret = scan.nextLine();
                        MyVideo.this.runOnUiThread(
                        		new ChangeText(ret));
                    }
                } catch (Exception EE) {
                    EE.printStackTrace();
                }
			}
    	}.start();
    	
    	view = (MySurfaceView)findViewById(R.id.mySurfaceViewVideo);
    	ForWard = (Button)findViewById(R.id.ForWard);
        BackWard = (Button)findViewById(R.id.BackWard);
		TurnLeft = (Button)findViewById(R.id.TurnLeft);	
		TurnRight = (Button)findViewById(R.id.TurnRight);
		showSpace = (TextView)findViewById(R.id.showspace);
		
		view.GetCameraIP(videostr);
		//前
		ForWard.setOnTouchListener(new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();
				switch(action){
					case MotionEvent.ACTION_DOWN:
				    	mPrintWriterClient.print(forWordStr); 
						mPrintWriterClient.flush();					    
				    	break;
					case MotionEvent.ACTION_UP:
						stopcar();	
						break;
					default:
						stopcar();
						break;
				}
				return false;
			}
		});
		//后
		BackWard.setOnTouchListener(new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();
				switch(action){
					case MotionEvent.ACTION_DOWN:	
						mPrintWriterClient.print(backWordStr); 	
						mPrintWriterClient.flush();
				    	break;
					case MotionEvent.ACTION_UP:		
						stopcar();	
						break;
					default:
						stopcar();	
						break;
				}
				return false;
			}
		});
		//左
		TurnLeft.setOnTouchListener(new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				int action = event.getAction();
				switch(action){
					case MotionEvent.ACTION_DOWN:	
						mPrintWriterClient.print(leftStr);
						mPrintWriterClient.flush();
				    	break;
					case MotionEvent.ACTION_UP:	
						stopcar();
						break;
					default:
						stopcar();
						break;
				}
				return false;
			}
		});
		//右
		TurnRight.setOnTouchListener(new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event){
				int action = event.getAction();
				switch(action){
					case MotionEvent.ACTION_DOWN:	
						mPrintWriterClient.print(rightStr); 	
						mPrintWriterClient.flush();
				    	break;
					case MotionEvent.ACTION_UP:	
						stopcar();				    
						break;
					default:
						stopcar();	
						break;
				}
				return false;
			}
		});
		
	}
	
	public void stopcar() {
		mPrintWriterClient.print("e"); 
		mPrintWriterClient.flush();
	}

	private long exitTime = 0;
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		if((System.currentTimeMillis()-exitTime)>2000){
			Toast.makeText(getApplication(), "再按一次返回键退出到主界面", Toast.LENGTH_SHORT).show();
			exitTime = System.currentTimeMillis();
		}else {
			super.onBackPressed();
		}
	}
	
	
	
	/**
	 * @author by dong
	 * function 用于接收超声波探测距离
	 */
	class ChangeText implements Runnable {
        String recvstr;
        ChangeText(String text) {
            this.recvstr = text;
        }
        public void run() {
        	showSpace.setText(recvstr);
//        	Toast.makeText(getApplication(), recvstr, Toast.LENGTH_SHORT).show();
        }   
    }
	
}


MySurfaceView:


package cn.dong.mycar;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder.Callback;
import android.content.Context;   
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;   
import android.graphics.Color;
import android.graphics.RectF;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements Callback, Runnable{
	private Thread mythread;
    private SurfaceHolder holder;    
    private Canvas canvas;    
    private String urlstr;
    URL videoUrl;
    HttpURLConnection conn;
    Bitmap bmp;  
    InputStream inputstream=null;
    
    private static int mScreenWidth; 
    private static int mScreenHeight;
    
    public MySurfaceView(Context context, AttributeSet attrs) {
    	super(context, attrs);
    	mythread = new Thread(this);
    	//获取屏幕宽高
    	DisplayMetrics dm = getResources().getDisplayMetrics(); 
		mScreenWidth = dm.widthPixels; 
		mScreenHeight = dm.heightPixels;    
		// 保持屏幕常亮
		this.setKeepScreenOn(true);
		//获得SurfaceHolder对象
    	holder = this.getHolder();
    	//回调函数
    	holder.addCallback(this);
	   }       
    	 
    public void surfaceChanged(SurfaceHolder holder, int format, int width,    
            int height) {    
    }    
    public void surfaceDestroyed(SurfaceHolder holder) {    
    }   
    public void GetCameraIP(String p){urlstr=p;}

	public void surfaceCreated(SurfaceHolder holder) {
		mythread.start();
	}
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			draw();
		}
	}

	private void draw() {
		// TODO Auto-generated method stub
		try{
			//创建一个URL对象
        	videoUrl = new URL(urlstr);	      
        	//利用HttpURLConnection对象从网络中获取网页数据
        	HttpURLConnection conn = (HttpURLConnection)videoUrl.openConnection();   
        	//设置输入流
        	conn.setDoInput(true);
        	conn.connect();
        	//得到网络返回的输入流
		 	inputstream = conn.getInputStream();
		 	//创建一个bitmap
		 	bmp = BitmapFactory.decodeStream(inputstream);
		 	//获得Canvas对象并锁定画布
        	canvas = holder.lockCanvas();
        	//Canvas绘画
        	canvas.drawColor(Color.WHITE);	 
        	RectF rectf = new RectF(0, 0, mScreenWidth, mScreenHeight);
        	canvas.drawBitmap(bmp, null,rectf, null);
        	//结束锁定画图,并提交改变,将图形显示
        	holder.unlockCanvasAndPost(canvas);
        	//关闭HttpURLConnection连接
        	conn.disconnect();
        }
        catch (IOException ex){
        	ex.printStackTrace();
        }
	}
}    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值