Skip to content Skip to sidebar Skip to footer

Can't Draw On Canvas

I'm developing a paint activity please take a look on the code I'm working on below: public class MyTouchEventView extends LinearLayout { private Paint paint = new Paint(); pr

Solution 1:

I only made few changes to your code. Check the snap shot

activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

   <RelativeLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_above="@+id/button1"
       android:id="@+id/rl"
       android:layout_alignParentLeft="true"
       android:layout_alignParentRight="true"
       android:layout_alignParentTop="true" >

</RelativeLayout>

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="14dp"
    android:text="Clear" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_marginRight="32dp"
    android:text="Save" />

</RelativeLayout>

MainActivity

    public class MainActivity extends Activity {

DrawingView dv ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    dv = new DrawingView(this);
    setContentView(R.layout.activity_main);
    RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
    rl.addView(dv);
    Button b = (Button) findViewById(R.id.button1);
    Button b1 = (Button) findViewById(R.id.button2);
    b.setOnClickListener(new OnClickListener() 
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
               dv.clear();   // on button click clear the draw
        }

    });
          // similarly you can save the draw. i have not added.
          // if you have trouble let me know

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

 public class DrawingView extends View {

     private Paint paint = new Paint();
     private Path path = new Path();
     private Paint circlePaint = new Paint();
     private Path circlePath = new Path();

     public Button btnReset;
     public Button btnSave;
     public LinearLayout.LayoutParams params;

     public DrawingView (Context context) {
         super(context);

         paint.setAntiAlias(true);
         paint.setColor(Color.GREEN);
         paint.setStyle(Paint.Style.STROKE);
         paint.setStrokeJoin(Paint.Join.ROUND);
         paint.setStrokeWidth(15f);

         circlePaint.setAntiAlias(true);
         circlePaint.setColor(Color.BLUE);
         circlePaint.setStyle(Paint.Style.STROKE);
         circlePaint.setStrokeJoin(Paint.Join.MITER);
         circlePaint.setStrokeWidth(4f);

     }
   public void clear()
   {
       path.reset();
       // Calls the onDraw() method
       invalidate();
   }
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
         canvas.drawPath(path, paint);
         canvas.drawPath(circlePath, circlePaint);
     }

     @Override
     public boolean onTouchEvent(MotionEvent event) {

         // Gives you x and y coordinates on the Event.
         float pointX = event.getX();
         float pointY = event.getY();

         // Checks for the event that occurs
         switch (event.getAction()) {
         case MotionEvent.ACTION_DOWN:
             path.moveTo(pointX, pointY);

             return true;
         case MotionEvent.ACTION_MOVE:
             path.lineTo(pointX, pointY);
             circlePath.reset();

             // (circle's center x-coordinate, y-coordinate, radius of the
             // circle, direction to wind the shape)
             circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW);
             //circlePath.addRect(pointX - 25, pointY - 25, pointX + 25, pointY + 25, Path.Direction.CW);
                 /* RectF rect = new RectF(pointX - 25, pointY - 25, pointX + 25, pointY + 25);
             circlePath.addRoundRect(rect, 0, 0, Path.Direction.CW);
                */
             break;

         case MotionEvent.ACTION_UP:
             circlePath.reset();

             break;
         default:
             return false;
         }

         // Schedules a repaint.
         // Force a view to draw.
         invalidate();
         return true;
     }
 }
 }

Snap Shot

enter image description here

Explanation

I used a Relative layout and placed buttons accordingly.

I used another relative layout with id rl. Added custom view to the same.

I extended a view rather than Linear Layout.

I defined a method clear to clear the draw which is called onClick of clear.

I used invalidate to refresh the draw.

Edit 2:

Save:

Note: Only the draw is saved. You can save the entire screen if you want to.

Add permission in Manifest File

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Use the below to save

    Button b1 = (Button) findViewById(R.id.button2);
    b1.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            AlertDialog.Builder editalert = new AlertDialog.Builder(MainActivity.this);
            editalert.setTitle("Please Enter the name with which you want to Save");
            final EditText input = new EditText(MainActivity.this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.FILL_PARENT,
                    LinearLayout.LayoutParams.FILL_PARENT);
            input.setLayoutParams(lp);
            editalert.setView(input);
            editalert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    rl.setDrawingCacheEnabled(true);
                    String name= input.getText().toString();
                    Bitmap bitmap =rl.getDrawingCache();
                    String root = Environment.getExternalStorageDirectory().toString();
                    File myDir = new File(root + "/MyDraw");    
                    myDir.mkdirs();
                    File file = new File (myDir, name+".png");
                    if (file.exists ()) file.delete ();         
                    try 
                    {
                        if(!file.exists())
                    {
                        file.createNewFile();
                    }
                        FileOutputStream ostream = new FileOutputStream(file);
                        bitmap.compress(CompressFormat.PNG, 10, ostream);
                       // System.out.println("saving......................................................"+path);
                        ostream.close();
                        rl.invalidate();                            
                    } 
                    catch (Exception e) 
                    {
                        e.printStackTrace();
                    }finally
                    {

                       rl.setDrawingCacheEnabled(false);                            
                    }
                }
            });
            editalert.show();   
        }

    });

Post a Comment for "Can't Draw On Canvas"