Drawing Lines on Images in Phimpme
In the editing section of the Phimpme app, we want a feature which lets the user write something on the image in their own handwriting. The user can also select different colour palette available inside the app. We aligned this feature in our editor section as Phimpme Image app allows a user to use our custom camera with the large number of editing options (Enhancement, Transform, Applying Stickers, Applying filters and writing on images). In this post, I am explaining how I implemented the draw feature in Phimpme Android app.
Let’s get started
Step -1: Create bitmap of Image and canvas to draw
The first step is to create a bitmap of Image on which you want to draw lines. Now we need a canvas to draw and canvas requires bitmap to work. So in this step, we will create a bitmap and new canvas to draw the line.
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); Bitmap bitmap = BitmapFactory.decodeFile(ImagePath, bmOptions); Canvas canvas = new Canvas(bitmap);
Once the canvas is initialized, we use paint class to draw on the canvas.
Step-2: Create Paint class to draw on canvas
In this step, we will create a new Paint class with some properties like colour, Stroke Width and Coordinate where we want to draw a line and it can be done by using the following code.
Paint paint = new Paint(); paint.setColor(Color.rgb(255, 153, 51)); paint.setStrokeWidth(10); int startx = 50; int starty = 90; int endx = 150; int endy = 360; canvas.drawLine(startx, starty, , endy, paint);
The above code will result in a straight line on the canvas like the below screenshot.
Step-3: Add support to draw on touch dynamically
In step 2 we have added the feature to draw a straight line, but what if the user wants to draw the lines on canvas with on touch event. So to achieve this we have to apply onTouchListener and applying coordinates dynamically and it can be done by using the following code.
@Override public boolean onTouchEvent(MotionEvent event) { boolean ret = super.onTouchEvent(event); float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: ret = true; last_x = x; last_y = y; break; case MotionEvent.ACTION_MOVE: ret = true; canvas.drawLine(last_x, last_y, x, y); last_x = x; last_y = y; this.postInvalidate(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: ret = false; break; } return ret; }
Now the above code will let you draw the lines dynamically. But, how? The answer is In on touch event, I am fetching coordinates of touch and applying it dynamically to a canvas. Now our feature is ready to draw the lines on canvas with finger touch.
Drawing line in Phimpme Editor
Step – 4: Adding eraser functionality
Till now we have added the draw on canvas functionality, but what if the user wants to erase particular area. So now we have to implement the eraser functionality. It is very simple now what we have to do again we have to draw, but we will set paint color to the transparent color. It will draw the transparent color on the existing line which results in the previous picture and it looks like we are erasing. It can be done by adding one line.
paint.setColor(eraser ? Color.TRANSPARENT : color);
Now we have done by drawing the lines on an image and erasing functionality.
Resources:
- Stackoverflow Example: https://stackoverflow.com/questions/3616676/how-to-draw-a-line-in-android
- Another blog post how to draw line on finger touch: http://androidrises.blogspot.in/2012/10/draw-line-on-finger-touch.html
- Official google documentation about Canvas: https://developer.android.com/reference/android/graphics/Canvas.html
- Official google doucmentation about paint: https://developer.android.com/reference/android/graphics/Paint.html
You must be logged in to post a comment.