Click here to Skip to main content
15,889,992 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
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:
Java
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.
Posted
Updated 25-Nov-11 6:46am
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900