My app must draw lines green color and send drawing data to echo server, when server get answer re-draw green line on black. So i don't know where i have to send messages to server, because when i do ACTION_UP, sending stops. My code:
public class MyActivity extends Activity{
private WebSocketClient mWebSocketClient;
private Paint mPaint;
private Paint socketPaint;
private Path socketPath;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private LinkedList<String> socketMessages;
private String[] tokens;
private String comma = "[,]";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
mPaint = new Paint();
mPaint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(1);
socketPaint = new Paint();
socketPaint.setColor(Color.BLACK);
socketPaint.setStyle(Paint.Style.STROKE);
socketPaint.setStrokeWidth(3);
socketMessages = new LinkedList<String>();
connectWebSocket();
}
public void connectWebSocket() {
URI uri = null;
try {
uri = new URI("ws://echo.websocket.org");
} catch (URISyntaxException e) {
e.printStackTrace();
}
mWebSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake handshakedata) {
Log.i("Websocket", "Opened");
}
@Override
public void onMessage(String s) {
final String message = s;
runOnUiThread(new Runnable() {
@Override
public void run() {
tokens = message.split(comma);
socketPath.moveTo(Float.valueOf(tokens[0]), Float.valueOf(tokens[1]));
socketPath.quadTo(Float.valueOf(tokens[2]), Float.valueOf(tokens[3]), (Float.valueOf(tokens[2]) + Float.valueOf(tokens[0]))/2, (Float.valueOf(tokens[3]) + Float.valueOf(tokens[1]))/2);
socketPath.lineTo(Float.valueOf(tokens[2]), Float.valueOf(tokens[3]));
mCanvas.drawPath(socketPath, socketPaint);
socketPath.reset();
}
});
}
@Override
public void onClose(int code, String reason, boolean remote) {
Log.i("Websocket", "Closed " + reason);
}
@Override
public void onError(Exception ex) {
Log.i("Websocket", "Error " + ex.getMessage());
}
};
mWebSocketClient.connect();
}
public void sendMessages(){
while(!socketMessages.isEmpty()){
mWebSocketClient.send(socketMessages.getFirst());
if(!socketMessages.isEmpty())
socketMessages.removeFirst();
}
}
public class MyView extends View {
private float mX, mY;
public MyView(Context c) {
super(c);
mPath = new Path();
socketPath = new Path();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
canvas.drawPath(mPath, mPaint);
canvas.drawPath(socketPath, socketPaint);
}
private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
//Maybe here LinkedList doesn't have enough time
socketMessages.add(String.valueOf(mX) + "," +String.valueOf(mY) + "," + String.valueOf(x) + "," + String.valueOf(y));
mX = x;
mY = y;
}
private void touch_up() {
mPath.lineTo(mX, mY);
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
//Or here when touch event done, this method not working
sendMessages();
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
}
}
}
0 comments:
Post a Comment