android 涂鸦

public class PaintView extends View {  
  
    private Canvas mCanvas;  
    private Path mPath;  
    private Paint mPaint;  
    private float mX, mY;  
    private Bitmap imgBitmap;  
  
  
    private static final float TOUCH_TOLERANCE = 4;  
  
    /** 
     * 构造 
     *  
     * @param context 
     * @param width 
     *            屏幕宽度 
     *  
     * @param height 
     *            屏幕高度 
     *  
     */  
  
    public PaintView(Context context, Bitmap bm, Paint paint) {  
        super(context);  
        this.imgBitmap = bm;  
        this.mPaint = paint;  
        mCanvas = new Canvas(imgBitmap);  
        mPath = new Path();  
    }  
  
    @Override  
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
        super.onSizeChanged(w, h, oldw, oldh);  
    }  
  
    @Override  
    protected void onDraw(Canvas canvas) {  
        canvas.drawBitmap(imgBitmap, 0, 0, mPaint);  
        canvas.drawPath(mPath, mPaint);  
        canvas.save(Canvas.ALL_SAVE_FLAG);  
        canvas.restore();  
    }  
  
    public Bitmap getBitmap() {  
        return imgBitmap;  
    }  
  
    /** 
     * 屏幕触摸开始 
     *  
     * @param x 
     *            X坐标 
     * @param y 
     *            Y坐标 
     */  
    private void touchStart(float x, float y) {  
        mPath.reset();  
        mPath.moveTo(x, y);  
        this.mX = x;  
        this.mY = y;  
    }  
  
    private void touchUp() {  
        mPath.lineTo(mX, mY);  
        mCanvas.drawPath(mPath, mPaint);  
        mPath.reset();  
    }  
  
    private void touchMove(float x, float y) {  
        float dx = Math.abs(x - mX);  
        float dy = Math.abs(y - mY);  
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {  
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);  
            mX = x;  
            mY = y;  
        }  
    }  
  
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        float x = event.getX();  
        float y = event.getY();  
  
        switch (event.getAction()) {  
        case MotionEvent.ACTION_DOWN:  
            touchStart(x, y);  
            invalidate();  
            break;  
        case MotionEvent.ACTION_MOVE:  
            touchMove(x, y);  
            invalidate();  
            break;  
        case MotionEvent.ACTION_UP:  
            touchUp();  
            invalidate();  
            break;  
        default:  
            break;  
        }  
  
        return true;  
  
    }  
  
}  
private Paint mPaint;  
    private MaskFilter mEmboss;  
    private MaskFilter mBlur;     
    Bitmap bitmap;  
    PaintView paintView;          
    LinearLayout linearLayout;    
    Bitmap imageBitmap;  
      
  
    public static final String MIME_TYPE_IMAGE_JPEG = "image/jpeg";  
    public static final int ACTIVITY_GET_IMAGE = 0;  
    private byte[] mContent;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        this.setContentView(R.layout.paint);  
          
      
          
        mPaint = new Paint();  
        mPaint.setAntiAlias(true);   
          
        mPaint.setStyle(Paint.Style.STROKE);  
        mPaint.setStrokeWidth(6);   
        mEmboss=new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f);  
        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);  
        linearLayout = (LinearLayout) findViewById(R.id.linearLayout);  
          
        //默认为灰色背景  
        mPaint.setColor(0xFFFF0000);      
  
    }  
      
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // 填充选项菜单  
        MenuInflater inflater = getMenuInflater();         
        SubMenu choosepicMenu = menu.addSubMenu(0,1,1,"选择图片");    
        SubMenu boldMenu = menu.addSubMenu(0,2,2,"线条粗细");  
        SubMenu effectMenu=menu.addSubMenu(0,3,3,"线条效果");  
        effectMenu.add(11, 7, 1, "浮雕");  
        effectMenu.add(11, 8, 2, "空心");  
        effectMenu.add(11, 9, 3, "模糊");  
        effectMenu.add(11, 10, 4, "正常");  
        SubMenu colorMenu=menu.addSubMenu(0,4,4,"线条颜色");  
        SubMenu clearMenu=menu.addSubMenu(0,5,5,"清除");  
        SubMenu saveMenu=menu.addSubMenu(0,6,6,"保存");  
  
        return super.onCreateOptionsMenu(menu);  
    }  
  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
          
        switch (item.getItemId()) {  
        case 1:           
            Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);  
            getImage.addCategory(Intent.CATEGORY_OPENABLE);  
            getImage.setType(MIME_TYPE_IMAGE_JPEG);  
            startActivityForResult(getImage, ACTIVITY_GET_IMAGE);  
              
            break;  
        case 2:  
            Toast.makeText(this, "线条粗细", Toast.LENGTH_LONG).show();  
            break;  
        case 4:  
            new ColorPickerDialog(this, this, mPaint.getColor()).show();  
            break;  
        case 5: //清除  
            break;  
        case 6: //保存图片  
            Bitmap bitmap = paintView.getBitmap();  
            FileOutputStream fos = null;  
            String filepath="/sdcard/"+System.currentTimeMillis()+".jpg";  
            try {  
                  
                fos = new FileOutputStream(filepath);  
            } catch (FileNotFoundException e) {  
  
                e.printStackTrace();  
            }  
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);  
            Toast.makeText(this, "图片文件已经保存到"+filepath +" 。",Toast.LENGTH_LONG).show();  
            try {  
                fos.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            break;  
        case 7: //浮雕  
            mPaint.setMaskFilter(mEmboss);  
            break;  
        case 8 :  
              
            break;  
        case 9:   
            mPaint.setMaskFilter(mBlur);  
            break;  
        case 10:  
            mPaint.setMaskFilter(null);  
        default:  
            break;  
        }  
          
        return super.onOptionsItemSelected(item);  
    }  
  
    @Override  
    public void colorChanged(int color) {  
        mPaint.setColor(color);       
    }  
      
      
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  
        if (resultCode != RESULT_OK) {  
            return;  
        }  
  
        ContentResolver resolver = getContentResolver();  
  
        if (requestCode == ACTIVITY_GET_IMAGE) {  
            try {  
                Uri originalUri = data.getData();  
                mContent = getBytesFromInputStream(resolver.openInputStream(Uri  
                        .parse(originalUri.toString())), 3500000);  
                imageBitmap = getPicFromBytes(mContent, null);  
                  
                bitmap = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap  
                        .getHeight());  
                Bitmap b=bitmap.copy(Bitmap.Config.ARGB_8888, true);  
                  
                paintView = new PaintView(this, b, mPaint);  
                linearLayout.removeAllViews();  
                linearLayout.addView(paintView);  
                  
                b=null;  
                imageBitmap=null;  
                  
            } catch (IOException e) {  
                System.out.println(e.getMessage());  
            }  
  
        }  
  
    }  
  
    public static Bitmap getPicFromBytes(byte[] bytes,  
            BitmapFactory.Options opts) {  
  
        if (bytes != null)  
            if (opts != null) {  
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,  
                        opts);  
            } else {  
                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);  
            }  
        return null;  
    }  
  
    public static byte[] getBytesFromInputStream(InputStream is, int bufsiz)  
            throws IOException {  
        int total = 0;  
        byte[] bytes = new byte[4096];  
        ByteBuffer bb = ByteBuffer.allocate(bufsiz);  
  
        while (true) {  
            int read = is.read(bytes);  
            if (read == -1)  
                break;  
            bb.put(bytes, 0, read);  
            total += read;  
        }  
  
        byte[] content = new byte[total];  
        bb.flip();  
        bb.get(content, 0, total);  
  
        return content;  
    }  
原文地址:https://www.cnblogs.com/top5/p/2381833.html