2012-03-20 52 views
0

我的目标是在一台设备上绘制一张图片以复制到另一台设备上,我设法将路径的坐标发送到网络线程,但无法在第二台设备上处理这些坐标。我将如何尽可能实时地使用流中的坐标在第二个设备上绘制路径。目前,我有一个螺纹连接:对象流到画布

public class connecting implements Runnable{ 

    Socket sock; 
    ObjectInputStream ois; 

    @Override 
    public void run() { 

     try{ 
      sock = new Socket("10.42.34.46", 1337);   
      InputStream is = sock.getInputStream(); 
      ois = new ObjectInputStream(new BufferedInputStream(is)); 


     }catch(IOException ex){ 
      ex.printStackTrace(); 
     } 

     while(true){ 
      com.DrawTastic.Drawring serverDraw = null; 

      serverDraw = (com.DrawTastic.Drawring) ois.readObject(); 

      float mX = serverDraw.getMx(); 
      float mY = serverDraw.getMy(); 


     } 
    } 

} 

我怎么会得到浮点型变量,不断绘制到此的onDraw方法在另一个线程

@Override 
    public void onDraw(Canvas canvas) { 

     connecting ncoords = new connecting(); 
     mPath.lineTo(mX, mY); 

     canvas.drawPath(mPath, mPaint); 
     canvas.drawColor(Color.WHITE); 

     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 
} 

回答

2

This is the most basic tutorial关于Java客户端/服务器编程。让我们先从命名

  • 客户是真正的触摸事件
  • 服务器设备收听由客户带来的事件交互的设备

客户实现onTouchEvent(MotionEvent)和将x和y坐标写入其套接字的OutputStream。即使您希望尽可能实时,您可能需要将事件(x,y和时间戳)本地存储并以特定时间间隔传输它们。像其他所有阻塞操作一样,它将在与主应用程序线程不同的线程上运行。这是一个伪实现

ClientActivity 
    thread: 
    while activity_is_running: 
     sleep 100 
     socket.write list_of_events 

    onCreate(): start_background_thread 
    onViewTouched(): thread.add_event 

服务器将有ServerSocket监听事件。每次收到活动时,都会画画。请注意,为了从套接字正在侦听的后台线程访问绘图线程,您可以使用Handler。 Handler只是在特定线程上运行某些代码的一种方式。您只需要为ServerActivity声明一个Handler实例变量并在onCreate中将其实例化:这种方式将Handler绑定到应用程序主线程,该线程也是UI线程。

ServerActivity 
    thread: 
    while activity_is_running: 
     handler.draw socket.get_event_from_input_stream 

    onCreate(): 
    handler: new Handler() 
    start_background_thread 

最后一部分是如何记住已经绘制的东西,无论是在客户端还是在服务器端。这是因为每次调用onDraw都会给你一个清晰的位图,所以你必须将每个事件存储在一个列表中并从该列表中绘制,或者你可以保存一个已经绘制的东西的缓存(see this paste