Michael Schwartz
Michael Schwartz

Reputation: 8425

Android Development Stuck at Painting/Drawing

What I'm trying to accomplish is simple. Make a very basic and/or primitive drawing application. No change brush size, no change color or anything like that just a simple drawing app like you'd draw on a piece of paper type simple.

I know about Canvas and Paint but not sure how to implement the free drawing consept I mentioned. Any help would be greatly apprechiated.

@Override
    protected void onDraw(Canvas canvas) {
    Paint p = new Paint();

    p.setColor(Color.BLUE);

    int width = getWidth();
    int height = getHeight();

    canvas.drawLine(0, 0, width, height, p);
}

Upvotes: 0

Views: 851

Answers (1)

Raghunandan
Raghunandan

Reputation: 133560

Your class must extend the view. You override onDraw(canvas) to draw the paths. You override onTouch(event) and call invalidate to refresh the draw. You use the path to draw.

public class MainActivity extends Activity {

DrawingView dv ;
RelativeLayout rl;   
private Paint       mPaint;
private DrawingManager mDrawingManager=null;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    dv = new DrawingView(this); // custom view
    setContentView(dv);
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(Color.GREEN);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(12);  // paint thickness
}

 public class DrawingView extends View {

        public int width;
        public  int height;
        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath;
        private Paint   mBitmapPaint;
        Context context;
        private Paint circlePaint;
        private Path circlePath;

        public DrawingView(Context c) {
        super(c);
        context=c;
        mPath = new Path(); // path used to draw
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);  

        circlePaint = new Paint(); 

        circlePath = new Path();
        circlePaint.setAntiAlias(true);
        circlePaint.setColor(Color.BLUE);
        circlePaint.setStyle(Paint.Style.STROKE);
        circlePaint.setStrokeJoin(Paint.Join.MITER);
        circlePaint.setStrokeWidth(4f); 
                  // draw a circle when user touch and move.  
        }

        @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) {
        super.onDraw(canvas);

        canvas.drawBitmap( mBitmap, 0, 0, mBitmapPaint);    
        canvas.drawPath( mPath,  mPaint); // draw the path
        canvas.drawPath( circlePath,  circlePaint); //draw the circle
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;

        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) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
             mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
            mX = x;
            mY = y;

            circlePath.reset();
            circlePath.addCircle(mX, mY, 30, Path.Direction.CW);
        }
        }
        private void touch_up() {
        mPath.lineTo(mX, mY);
        circlePath.reset();
        // commit the path to our offscreen
        mCanvas.drawPath(mPath,  mPaint);
        // kill this so we don't double draw
        mPath.reset();
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) { // touch events
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touch_start(x, y);
                invalidate(); // invalidate to refresh
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touch_up();
                invalidate();
                break;
        }
        return true;
        }  
        }

}

enter image description here

Upvotes: 1

Related Questions