游戏是蓝牙联机游戏,现在比如有A,B两个手机,当我手触摸A手机屏幕后,手机会通过蓝牙将手指触摸在A手机上的坐标发送给B手机,B手机收到坐标后会根据坐标绘制一个小球,从而实现手指在A手机上滑动而B手机显示一个在移动的小球。
但是现在遇到的问题是B手机在绘制移动的小球时延迟非常的大,没办法做到实时性,并且当手指滑动过长时间后软件会崩溃。求教解决办法,下面是我根据坐标绘图的代码void SimpleDraw() {
Canvas canvas = sfh.lockCanvas();// 关键:获取画布
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);// 画笔为绿色
mPaint.setStrokeWidth(2);// 设置画笔粗细
canvas.drawCircle(x, y, 45, mPaint);
//System.out.print(Integer.parseInt(xx));
sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
}
void ClearDraw() {
Canvas canvas = sfh.lockCanvas();
canvas.drawColor(Color.BLACK);// 清除画布
sfh.unlockCanvasAndPost(canvas);
} 要实时绘图显示小球位置只需调用一下两个函数即可ClearDraw();
SimpleDraw();
但是现在遇到的问题是B手机在绘制移动的小球时延迟非常的大,没办法做到实时性,并且当手指滑动过长时间后软件会崩溃。求教解决办法,下面是我根据坐标绘图的代码void SimpleDraw() {
Canvas canvas = sfh.lockCanvas();// 关键:获取画布
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);// 画笔为绿色
mPaint.setStrokeWidth(2);// 设置画笔粗细
canvas.drawCircle(x, y, 45, mPaint);
//System.out.print(Integer.parseInt(xx));
sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
}
void ClearDraw() {
Canvas canvas = sfh.lockCanvas();
canvas.drawColor(Color.BLACK);// 清除画布
sfh.unlockCanvasAndPost(canvas);
} 要实时绘图显示小球位置只需调用一下两个函数即可ClearDraw();
SimpleDraw();
我之前试过只在B手机上放一个textview来显示A手机的触摸数据,这时候倒是挺快的,数据实时同步,就是只要把绘图小球加进去后就变慢了
void SimpleDraw(float xx,float yy) {
Canvas canvas = sfh.lockCanvas();// 关键:获取画布
Paint mPaint = new Paint();
mPaint.setColor(Color.GREEN);// 画笔为绿色
mPaint.setStrokeWidth(2);// 设置画笔粗细
canvas.drawCircle(xx, yy, 20, mPaint);
sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
}
void ClearDraw() {
Canvas canvas = sfh.lockCanvas();
canvas.drawColor(Color.BLACK);// 清除画布
sfh.unlockCanvasAndPost(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
//获得触摸的坐标
x = event.getRawX();
y = event.getRawY();
switch (event.getAction())
{
//触摸屏幕时刻
case MotionEvent.ACTION_DOWN: break;
//触摸并移动时刻
case MotionEvent.ACTION_MOVE: break;
//终止触摸时刻
case MotionEvent.ACTION_UP:
break;
}
if (x+"".length()>0 || y+"".length()>0) {
sendMessageHandle(x+""+" "+y+"");
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
}else
Toast.makeText(mContext, "发送内容不能为空!", Toast.LENGTH_SHORT).show();
return super.onTouchEvent(event);
}
private void init() {
list = new ArrayList<deviceListItem>();
mAdapter = new deviceListAdapter(this, list);
disconnectButton= (Button)findViewById(R.id.btn_disconnect);
disconnectButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
{
shutdownClient();
}
else if (Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
{
shutdownServer();
}
Bluetooth.isOpen = false;
Bluetooth.serviceOrCilent=ServerOrCilent.NONE;
Toast.makeText(mContext, "已断开连接!", Toast.LENGTH_SHORT).show();
}
});
} private Handler LinkDetectedHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Toast.makeText(mContext, (String)msg.obj, Toast.LENGTH_LONG).show();
if(msg.what==1)
{
list.add(new deviceListItem((String)msg.obj, true));
}
else
{
list.add(new deviceListItem((String)msg.obj, false));
}
mAdapter.notifyDataSetChanged();
}
};
//用来显示接收到的对方手机的触摸坐标
private Handler LinkDetectedHandler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
xy.setText((String)msg.obj);
ClearDraw();
Scanner input = new Scanner(xy.getText()+"");
SimpleDraw((int)(input.nextFloat()),(int)(input.nextFloat()));
}
};
@Override
public synchronized void onPause() {
super.onPause();
}
@Override
public synchronized void onResume() {
super.onResume();
if(Bluetooth.isOpen)
{
Toast.makeText(mContext, "连接已经打开,可以通信。如果要再建立连接,请先断开!", Toast.LENGTH_SHORT).show();
return;
}
if(Bluetooth.serviceOrCilent==ServerOrCilent.CILENT)
{
String address = Bluetooth.BlueToothAddress;
if(!address.equals("null"))
{
device = mBluetoothAdapter.getRemoteDevice(address);
clientConnectThread = new clientThread();
clientConnectThread.start();
Bluetooth.isOpen = true;
}
else
{
Toast.makeText(mContext, "address is null !", Toast.LENGTH_SHORT).show();
}
}
else if(Bluetooth.serviceOrCilent==ServerOrCilent.SERVICE)
{
startServerThread = new ServerThread();
startServerThread.start();
Bluetooth.isOpen = true;
}
}
//开启客户端
private class clientThread extends Thread {
public void run() {
try {
//创建一个Socket连接:只需要服务器在注册时的UUID号
socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
//连接
Message msg2 = new Message();
msg2.obj = "请稍候,正在连接服务器:"+Bluetooth.BlueToothAddress;
msg2.what = 0;
LinkDetectedHandler.sendMessage(msg2);
socket.connect();
Message msg = new Message();
msg.obj = "已经连接上服务端!可以发送信息。";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
}
catch (IOException e)
{
Log.e("connect", "", e);
Message msg = new Message();
msg.obj = "连接服务端异常!断开连接重新试一试。";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
}
}
}; //开启服务器
private class ServerThread extends Thread {
public void run() {
try {
/* 创建一个蓝牙服务器
* 参数分别:服务器名称、UUID */
mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Log.d("server", "wait cilent connect...");
Message msg = new Message();
msg.obj = "请稍候,正在等待客户端的连接...";
msg.what = 0;
LinkDetectedHandler.sendMessage(msg);
/* 接受客户端的连接请求 */
socket = mserverSocket.accept();
Log.d("server", "accept success !");
Message msg2 = new Message();
String info = "客户端已经连接上!可以发送信息。";
msg2.obj = info;
msg.what = 0;
LinkDetectedHandler.sendMessage(msg2);
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
/* 停止服务器 */
private void shutdownServer() {
new Thread() {
public void run() {
if(startServerThread != null)
{
startServerThread.interrupt();
startServerThread = null;
}
if(mreadThread != null)
{
mreadThread.interrupt();
mreadThread = null;
}
try {
if(socket != null)
{
socket.close();
socket = null;
}
if (mserverSocket != null)
{
mserverSocket.close();/* 关闭服务器 */
mserverSocket = null;
}
} catch (IOException e) {
Log.e("server", "mserverSocket.close()", e);
}
};
}.start();
}
/* 停止客户端连接 */
private void shutdownClient() {
new Thread() {
public void run() {
if(clientConnectThread!=null)
{
clientConnectThread.interrupt();
clientConnectThread= null;
}
if(mreadThread != null)
{
mreadThread.interrupt();
mreadThread = null;
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket = null;
}
};
}.start();
}
//发送数据
private void sendMessageHandle(String msg)
{
if (socket == null)
{
Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show();
return;
}
try {
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取数据
private class readThread extends Thread {
public void run() {
byte[] buffer = new byte[1024];
int bytes;
InputStream mmInStream = null;
try {
mmInStream = socket.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (true) {
try {
// Read from the InputStream
if( (bytes = mmInStream.read(buffer)) > 0 )
{
byte[] buf_data = new byte[bytes];
for(int i=0; i<bytes; i++)
{
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Message msg = new Message();
msg.obj = s;
msg.what = 1;
LinkDetectedHandler2.sendMessage(msg);
}
} catch (IOException e) {
try {
mmInStream.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
break;
}
}
}
}