In my paint app I am hoping that when I drag my finger across the screen a line will appear following my fingers trail. While, my app achieves some of that the screen of my avd flickers and instead of one continuous line it is a lot of smaller lines making a broken larger one.
Here is my code for the custom view:
package com.android.paint;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.view.MotionEvent;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Panel extends SurfaceView {
private List<point> points = new ArrayList<point>();
private Point point = new Point();
private int strokeColor = Color.RED;
private DrawingThread thread;
private Callback callback = new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while(retry) {
try {
thread.join();
retry = false;
} catch(InterruptedException ex) { }
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
};
public Panel(Context context) {
super(context);
getHolder().addCallback(callback);
thread = new DrawingThread(getHolder(), this);
setFocusable(true);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(strokeColor);
try {
Point previousPoint = points.get(points.size() - 2);
Point currentPoint = points.get(points.size() - 1);
canvas.drawLine(previousPoint.x, previousPoint.y, currentPoint.x, currentPoint.y, paint);
} catch(IndexOutOfBoundsException ex) { }
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if(event.getAction() == MotionEvent.ACTION_MOVE) {
point = new Point((int) event.getX(), (int) event.getY());
points.add(point);
}
return true;
}
}</point></point>
DrawingThread is a simple thread that calls onDraw.
If necessary here is the code:
package com.android.paint;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
public class DrawingThread extends Thread {
private SurfaceHolder surfaceHolder;
private Panel panel;
private boolean running = false;
public DrawingThread(SurfaceHolder surfaceHolder, Panel panel) {
this.surfaceHolder = surfaceHolder;
this.panel = panel;
}
public void setRunning(boolean running) {
this.running = running;
}
@Override
public void run() {
Canvas c;
while(running) {
c = null;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
panel.onDraw(c);
}
} finally {
if(c != null)
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
Edit: Code update.