Can't draw on canvas

前端 未结 1 767
再見小時候
再見小時候 2021-01-17 06:06

I\'m developing a paint activity please take a look on the code I\'m working on below:

    public class MyTouchEventView extends LinearLayout {

private Pain         


        
相关标签:
1条回答
  • 2021-01-17 06:22

    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();   
            }
    
        });
    
    0 讨论(0)
提交回复
热议问题