Question

In my Draw Activity class when an item from the spinner is selected, my brush size changes. However it also changes the size of the previously drawed path. I tried to create a new paint object for every selection from the spinner, but still doesn't work. Here tv is an instance of the eventTouchView class which has the draw method. Not sure what is wrong: In my Draw Activity class :

      @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub
        tv.paint= new Paint();
        tv.paint.setStyle(Paint.Style.STROKE);
       tv.paint.setStrokeJoin(Paint.Join.ROUND);

        if ( arg0.getSelectedItem().equals("10f")){

            tv.paint.setStrokeWidth(10f);

        }
        else if ( arg0.getSelectedItem().equals("20f")){

            tv.paint.setStrokeWidth(20f);
        }
        else if ( arg0.getSelectedItem().equals("40f")){

            tv.paint.setStrokeWidth(40f);
        }
        else if ( arg0.getSelectedItem().equals("50f")){

            tv.paint.setStrokeWidth(50f);
        }
        else {

            tv.paint.setStrokeWidth(30f);
        }
    }

In my ViewTouchEvent class:

public class ViewTouchEvent extends View{

    Paint paint;
    Path path = new Path();

    protected void onDraw(Canvas canvas){
        pathToGrayscale();
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(grayscaleBmp, 0, 100, null);
        canvas.drawPath(path, paint);
        canvas.drawPath(cursor, cursorPaint);

    }

--------------------------------

New Version: I tried the steps below, but not sure what is wrong with the code below -

@SuppressLint("DrawAllocation")
protected void onDraw(Canvas canvas){

    pathToGrayscale();
    canvas.drawColor(Color.WHITE);
    canvas.drawBitmap(grayscaleBmp, 0, 100, null);
    for (int i =0; i < drawings.size(); i++){
        canvas.drawPath(drawings.get(i).getPath(), drawings.get(0).getPaint());

    }
    //canvas.drawPath(path, paint);
    canvas.drawPath(cursor, cursorPaint);

}

 public boolean onTouchEvent(MotionEvent event){

    float Xpos = event.getX();
    float Ypos = event.getY();
    //drawings = new Vector<Drawing>();
    if (selection == 10){
        Drawing draw1 = new Drawing();
        draw1.getPaint().setStrokeWidth(10f);
        draw1.getPaint().setStyle(Paint.Style.STROKE);
        draw1.getPaint().setStrokeJoin(Paint.Join.ROUND);
        drawings.add(draw1);
    }
    else if (selection == 20){
        Drawing draw2 = new Drawing();
        draw2.getPaint().setStrokeWidth(20f);
        draw2.getPaint().setStyle(Paint.Style.STROKE);
        draw2.getPaint().setStrokeJoin(Paint.Join.ROUND);
        drawings.add(draw2);

    }
    else if (selection == 30){
        Drawing draw3 = new Drawing();
        draw3.getPaint().setStrokeWidth(30f);
        draw3.getPaint().setStyle(Paint.Style.STROKE);
        draw3.getPaint().setStrokeJoin(Paint.Join.ROUND);
        drawings.add(draw3);

    }
    else if (selection == 40){
        Drawing draw4 = new Drawing();
        draw4.getPaint().setStrokeWidth(40f);
        draw4.getPaint().setStyle(Paint.Style.STROKE);
        draw4.getPaint().setStrokeJoin(Paint.Join.ROUND);
        drawings.add(draw4);

    }
    else if (selection == 50){
        Drawing draw5 = new Drawing();
        draw5.getPaint().setStrokeWidth(50f);
        draw5.getPaint().setStyle(Paint.Style.STROKE);
        draw5.getPaint().setStrokeJoin(Paint.Join.ROUND);
        drawings.add(draw5);

    }
    else{
        Drawing draw6 = new Drawing();
        draw6.getPaint().setStrokeWidth(70f);
        draw6.getPaint().setStyle(Paint.Style.STROKE);
        draw6.getPaint().setStrokeJoin(Paint.Join.ROUND);
        drawings.add(draw6);

    }


    //ArrayList <Pair<Float, Float>> pathPixels = new ArrayList <Pair<Float, Float>>();
    switch(event.getAction()){
    case MotionEvent.ACTION_DOWN:
        drawings.get(drawings.size()-1).getPath().moveTo(Xpos, Ypos);
        xPathPixels.add(Xpos);
        yPathPixels.add(Ypos);
        //int grayPixel = grayBmp.getPixel(Math.round(Xpos), Math.round(Ypos));
        //resizedBmp.setPixel(Math.round(event.getX()),  Math.round(event.getY()), grayPixel);
        return true;


    case MotionEvent.ACTION_MOVE:
        drawings.get(drawings.size()-1).getPath().lineTo(Xpos, Ypos);
        xPathPixels.add(Xpos);
        yPathPixels.add(Ypos);
        //pathToGrayscale();

        //int grayPixel2 = grayBmp.getPixel(Math.round(Xpos), Math.round(Ypos));
        //resizedBmp.setPixel(Math.round(event.getX()),  Math.round(event.getY()), grayPixel2);
        cursor.reset();

        cursor.addCircle(Xpos, Ypos, 30, Path.Direction.CW);

        break;

    case MotionEvent.ACTION_UP:
        //pathToGrayscale();
        System.out.println("xPath : " + xPathPixels + " " + "yPath : " + yPathPixels);
        cursor.reset();

        break;

    default:
        return false;

    }

    invalidate();

    return true;

}
Was it helpful?

Solution

You will need to make some changes -

(1.) Create a model class in your project lets say it "Drawing" having Paint and Path instances wrapped

    class Drawing {
        Paint paint;
        Path path;
        //Getter & Setter
    }

(2.) Create a list of type Drawing in ViewTouchEvent class.

    Vector<Drawing> drawings = new Vector<Drawing>();

(3.) Capture onTouchEvent() and Create your Drawing object with its corresponding Path and paint instances. (4.) Here each Drawing will have its own paint properties and not common.

(5.) Now, add this drawing instance to drawingList.

(6.) Call invalidate(), this will call onDraw now.

(7.) Here you should iterate over the list and calling getPath() and getPaint() for each drawing instance you can draw all your drawing with their specific paint and path objects.

NOTE : You will have to maintain one current drawing also for visualisation of current path being drawn.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top