2

I am using a custom class for a drawing application. It works fine but I got one issue. When ever I draw with normal motion, it shows edges and when I draw with slow motion, it draws fine.

My custom class :

public class MyCanvas extends View {

private Path drawPath;
private Paint drawPaint, canvasPaint;
private int paintColor = 0xFF660000;
private Canvas drawCanvas;
private Bitmap canvasBitmap;


public MyCanvas(Context context) {
    super(context);
    setUpDrawing();
}

public MyCanvas(Context context, AttributeSet attrs) {
    super(context, attrs);
    setUpDrawing();
}

public MyCanvas(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    setUpDrawing();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MyCanvas(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    setUpDrawing();
}

private void setUpDrawing() {
    drawPath = new Path();
    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(3F);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStyle(Paint.Style.STROKE);
    canvasPaint = new Paint(Paint.DITHER_FLAG);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h,
            Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawPath.lineTo(touchX, touchY);
            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}}

result after drawing : enter image description here

needed :

enter image description here

I need help to remove edges and bring smoothness while drawing. I also accelerated hardware but result is same.

Aamir Ali
  • 203
  • 1
  • 8
  • touch events are emitted in the pace of the device frame rate. Probably it is simply not enough points for creating a smooth curves. There are methods to draw curves and you can create control points by using curves. you can take a look at this https://medium.com/@pranjalg2308/understanding-bezier-curve-in-android-and-moddinggraphview-library-a9b1f0f95cd0 – Efi G Jan 28 '21 at 13:51

0 Answers0