Android studio中在自定义控件中设置监听器监听手指在容器内的触摸动作,并返回两个浮点数坐标,建立了线程来向服务器发送数据流,匿名内部类中处理监听的动作,并且启动线程,当手指动作还未停止上,线程内的outputstream.write()与outputstream.flush()不立即清空缓冲区,怎么做到在监听手指动作的同时,又能发送数据,并用代码举例说明
时间: 2023-05-25 10:01:51 浏览: 98
A:
首先,在自定义控件中,我们可以使用 onTouchEvent() 方法来监听控件内的手指触摸动作,并返回对应的坐标。示例代码如下:
```
public class MyView extends View {
private float lastX, lastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
// TODO: 处理手指移动事件,可在此处发送数据
break;
case MotionEvent.ACTION_UP:
// TODO: 处理手指抬起事件,发送最后一次数据
break;
}
lastX = x;
lastY = y;
return true;
}
}
```
在 onTouchEvent() 方法中,我们可以根据手指移动的坐标,在匿名内部类中启动一个线程,发送数据流到服务器。具体代码如下:
```
public class MyView extends View {
private float lastX, lastY;
private OutputStream outputStream;
public MyView(Context context) {
super(context);
// TODO: 初始化 outputStream(例如在构造函数中)
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
// 发送移动数据
sendData(x, y);
break;
case MotionEvent.ACTION_UP:
// 发送最后一次数据
sendData(x, y);
break;
}
lastX = x;
lastY = y;
return true;
}
private void sendData(final float x, final float y) {
new Thread(new Runnable() {
@Override
public void run() {
try {
outputStream.write((x + "," + y + "\n").getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
```
在 sendData() 方法中,我们启动了一个新线程,将接收到的坐标字符串按字节数组形式写入到 outputStream 中,并调用 outputStream.flush() 方法及时清空缓冲区,确保数据及时发送到服务器。
阅读全文