自定义的MyView类:
package qieyi71.drawtool;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;/**
 * Created by Administrator on 2016/8/6.
 */public class MyView extends SurfaceView implements SurfaceHolder.Callback,OnTouchListener{    private SurfaceHolder holder =null;
    private Canvas canvas =null;
    private Canvas canvasTemp =null;
    private Bitmap bitmap =null;
    public Paint p = null;
    private Path path = new Path();
    private boolean isfirst = true;
    int color = Color.RED;    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        p= new Paint();
        holder = getHolder();
        holder.addCallback(this);
        p.setColor(color);
        p.setStrokeWidth(20);
        p.setPathEffect(new CornerPathEffect(30));
        p.setAntiAlias(true);
        p.setStyle(Paint.Style.STROKE);
        p.setStrokeCap(p.getStrokeCap().ROUND);
        setOnTouchListener(this);
    }    public  void colorUpdate(int color){
        canvas.save();
        p.setColor(color);
        canvas.restore();
    }   public void draw(){
       try {
           canvas = holder.lockCanvas();
           if (holder != null) {
               canvasTemp.drawColor(Color.WHITE);
               //p.setPathEffect(new CornerPathEffect(30));
               canvasTemp.drawPath(path, p);
               canvas.drawBitmap(bitmap, 0, 0, null);
           }
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           if (holder != null) {
               holder.unlockCanvasAndPost(canvas);
           }
       }
    }    private  String getTime(){
        return new SimpleDateFormat("HHmmssSSS").format(new Date(System.currentTimeMillis()));
    }    public void saveCanvas(View v) {
        FileOutputStream fos = null;
        try {
            String fileName = getTime();
            String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + fileName + ".png";
            fos = new FileOutputStream(new File(filePath));
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            MediaScannerConnection.scanFile(getContext(), new String[]{filePath}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        @Override
                        public void onScanCompleted(String path, Uri uri) {
                            Log.v("MediaScanWork", "file " + path
                                    + " was scanned seccessfully: " + uri);
                        }
                    });
            Toast.makeText(getContext(), "保存成功,文件名:" + fileName + ".png", Toast.LENGTH_LONG).show();
            clear();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void clear() {
        path.reset();
        isfirst=true;
        draw();
    }    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
                Bitmap.Config.ARGB_8888);
        canvasTemp = new Canvas(bitmap);
        draw();
    }    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {    }    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {    }    @Override
    public boolean onTouch(View v, MotionEvent motionEvent) {            switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(motionEvent.getX(), motionEvent.getY());
                draw();
                break;            case MotionEvent.ACTION_MOVE:
                if(motionEvent.getPointerCount()==1&&isfirst) {
                    path.lineTo(motionEvent.getX(), motionEvent.getY());
                    draw();
                }
                break;                case MotionEvent.ACTION_POINTER_DOWN:
                isfirst=false;
                break;                case MotionEvent.ACTION_UP:
                        isfirst = true;
                        break;            default:
                break;
        }
        //invalidate();
        return true;
    }
}MainActivity类:
package qieyi71.drawtool;import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {    private Button btn;
    private  MyView view;
    private int whichColor = 0;    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn);
        view = (MyView)findViewById(R.id.draw);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                view.clear();
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int item_id = item.getItemId();
        switch (item_id) {
            case R.id.menu1:
            {
                Dialog mDialog = new AlertDialog.Builder(MainActivity.this)
                        .setTitle("颜色设置")
                        .setSingleChoiceItems(new String[]{"白色","绿色","红色"}, whichColor, new DialogInterface.OnClickListener()
                        {
                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                switch(which)
                                {
                                    case 0:
                                    {
                                        view.p.setColor(Color.WHITE);
                                        whichColor = 0;
                                        break;
                                    }
                                    case 1:
                                    {
                                        view.colorUpdate(Color.GREEN);
                                        whichColor = 1;
                                        break;
                                    }
                                    case 2:
                                    {
                                        view.p.setColor(Color.RED);
                                        whichColor = 2;
                                        break;
                                    }
                                }
                            }
                        })
                        .setPositiveButton("确定", new DialogInterface.OnClickListener()
                        {                            @Override
                            public void onClick(DialogInterface dialog, int which)
                            {
                                dialog.dismiss();
                            }
                        })
                        .create();
                mDialog.show();                break;
            }
            case R.id.menu2:                break;
            case R.id.menu3:
                view.saveCanvas(view);
                break;            default:
                return false;
        }
        return true;
    }
}主布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="qieyi71.drawtool.MainActivity">    <qieyi71.drawtool.MyView
        android:id="@+id/draw"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
         />
    <Button
        android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="清理画布"/></LinearLayout>菜单布局:
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu1"
     android:title="画笔颜色"
     /> <item android:id="@+id/menu2"
     android:title="画笔大小"
     /> <item android:id="@+id/menu3"
     android:title="保存"
     />
</menu>