3

I am working on Drawing app , this app is almost complete. Now I am stuck at one problem i.e. If I touch then my points is registered in touch event and saved in array. But this single touch dot is not drawn on canvas . But if i draw a path then it is drawn . Below is my code :

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawBitmap(canvasBitmap, 0, 0, mPaint);



        for (int size = mCompletedPaths.size(), i = 0; i < size; i++) {

            PaintItem item1 = mCompletedPaths.get(i);

            mPaint.setColor(item1.brushColor);
            mPaint.setStrokeWidth(item1.brushSize);
            mPaint.setAntiAlias(true);
            mPaint.setDither(true);

            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);  
            mPaint.setStrokeCap(Paint.Cap.ROUND);
            HashMap<Integer, Path> hm = item1.paths;

            for (int msize = hm.size(), j = 0; j < msize; j++) {



                    canvas.drawPath(hm.get(j), mPaint);


            }

        }

    } 

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int maskedAction = event.getActionMasked();




        Log.d("", "onTouchEvent");

        switch (maskedAction) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN: {

            paths = new HashMap<Integer, Path>();
            cor.setStrokeWidth(brushSize);
            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = new Path();
                p.moveTo(event.getX(i), event.getY(i));

                paths.put(event.getPointerId(i), p);
                mX.put(event.getPointerId(i), event.getX(i));
                mY.put(event.getPointerId(i), event.getY(i));
                // mArrayList.add(paths);

                mCompletedPaths.add(new PaintItem(paths, brushSize, cor
                        .getColor()));
            }
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = paths.get(event.getPointerId(i));
                if (p != null) { 
                    float x = event.getX(i);
                    float y = event.getY(i);
                    p.quadTo(mX.get(event.getPointerId(i)),
                            mY.get(event.getPointerId(i)),
                            (x + mX.get(event.getPointerId(i))) / 2,
                            (y + mY.get(event.getPointerId(i))) / 2);
                    mX.put(event.getPointerId(i), event.getX(i));
                    mY.put(event.getPointerId(i), event.getY(i));
                }
            }
            invalidate();
            break;
        }
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL: { 


            }
}
        }

        return true;
    }

I need to draw path is user draw long line . I user just press (Like if point is registered) then it draw simple point . Please help me, These issues delay my app .

1 Answers1

1

Idea To solve this answer is taken from

Android FingerPaint sample does not draw dot?

My Code :

private boolean mDrawPoint;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int maskedAction = event.getActionMasked();

        Log.d("onTouchEvent");

        switch (maskedAction) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN: {
            mDrawPoint = true;
            paths = new HashMap<Integer, Path>();
            cor.setStrokeWidth(brushSize);
            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = new Path();


                p.moveTo(event.getX(i), event.getY(i));

                paths.put(event.getPointerId(i), p);
                mX.put(event.getPointerId(i), event.getX(i));
                mY.put(event.getPointerId(i), event.getY(i));


                mCompletedPaths.add(new PaintItem(paths, brushSize, cor
                        .getColor(), event.getX(i), event.getY(i)));
            }
            invalidate();


            break;
        }
        case MotionEvent.ACTION_MOVE: {

            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                Path p = paths.get(event.getPointerId(i));
                if (p != null) {
                    float x = event.getX(i);
                    float y = event.getY(i);

                    Log.e("points  Move " + event.getX(i) + "========"
                            + event.getY(i));

                    float dx = Math.abs(x - mX.get(event.getPointerId(i)));
                    float dy = Math.abs(y - mY.get(event.getPointerId(i)));
                    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {

                        p.quadTo(mX.get(event.getPointerId(i)),
                                mY.get(event.getPointerId(i)),
                                (x + mX.get(event.getPointerId(i))) / 2,
                                (y + mY.get(event.getPointerId(i))) / 2);

                        mDrawPoint = false;
                        mX.put(event.getPointerId(i), event.getX(i));
                        mY.put(event.getPointerId(i), event.getY(i));

                        mPaint.setColor(cor.getColor());

                        mPaint.setStrokeWidth(brushSize);
                        mPaint.setAntiAlias(true);
                        mPaint.setDither(true);

                        mPaint.setStyle(Paint.Style.STROKE);
                        mPaint.setStrokeJoin(Paint.Join.ROUND);
                        mPaint.setStrokeCap(Paint.Cap.ROUND);
                        drawCanvas.drawPath(p, mPaint);
                    }

                } 
            }
            invalidate();
            break;
        }
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:

            for (int size = event.getPointerCount(), i = 0; i < size; i++) {
                if (mDrawPoint) {
                    drawCanvas.drawPoint(mX.get(event.getPointerId(i)),
                            mY.get(event.getPointerId(i)), cor);
                }


            }


            invalidate();

            break;

        case MotionEvent.ACTION_CANCEL: {



            }


        }
Community
  • 1
  • 1