对象流到画布

时间:2012-03-20 17:36:23

标签: java android multithreading android-canvas

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

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);
    }
} 

1 个答案:

答案 0 :(得分: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只是在特定线程上运行某些代码的一种方法。您只需要为Handler声明ServerActivity实例变量并在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