如何在Android中测量画布上的手绘图像?

时间:2018-10-16 15:54:22

标签: android android-canvas

我要在画布上绘制图像,然后将其转换为位图。然后,我将其拖到屏幕上。很好,我想要的是onTouchEvent,在此图像周围绘制一个矩形,而不是整个画布。所以我想知道是否可以测量绘图的宽度和高度,并从画布的宽度和高度中减去它,但是我很挣扎,不确定如何实现?除非有更好的主意,否则有人可以建议。

 private static class DrawingView extends View {

    float x = 0f,y = 0f;
    float dX,dY;
    Paint paint;

    public DrawingView(Context context){
        super(context);
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.id.main);
        paint = new Paint();
    }

    public boolean onTouchEvent(MotionEvent event){
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                dX = this.getX() - event.getRawX();
                dY = this.getY() - event.getRawY();
                invalidate();
            break;
            case MotionEvent.ACTION_MOVE:
                this.setX(event.getRawX() + dX);
                this.setY(event.getRawY() + dY);
                invalidate();
            break;
            case MotionEvent.ACTION_UP:
                invalidate();
            break;
        }
        return true;
    }

    @Override
    public void onDraw(Canvas canvas) {

        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.BLACK);
        canvas.drawBitmap(bitmap, x, y, paint);

        float left = (x + (bitmap.getWidth()/2));
        float top = (y + (bitmap.getHeight()/2));
        float right = bitmap.getWidth() - left;
        float bottom = bitmap.getHeight() - top;
        canvas.drawRect(left, top, right, bottom, paint);
    }
}//End of inner class

我的绘画课

public class DrawView extends View {

        private Paint drawPaint, canvasPaint;
        private Canvas drawCanvas;
        private Bitmap canvasBitmap;
        private SparseArray<Path> paths;

        public DrawView(Context context) {
            super(context);
            setupDrawing();
        }

        public DrawView(Context context, AttributeSet attrs) {
            super(context, attrs);
            setupDrawing();
        }

        public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            setupDrawing();
        }

        private void setupDrawing() {
            paths = new SparseArray<>();

            drawPaint = new Paint();
            drawPaint.setColor(Color.BLACK);
            drawPaint.setAntiAlias(true);
            drawPaint.setStrokeWidth(9);
            drawPaint.setStyle(Paint.Style.STROKE);
            drawPaint.setStrokeJoin(Paint.Join.ROUND);
            drawPaint.setStrokeCap(Paint.Cap.ROUND);
            canvasPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            drawCanvas = new Canvas(canvasBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {

            canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
                for (int i = 0; i < paths.size(); i++) {
                    canvas.drawPath(paths.valueAt(i), drawPaint);
                }
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int index = event.getActionIndex();
            int id = event.getPointerId(index);
            final Point p = new Point();

            Path path;
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_POINTER_DOWN:
                    path = new Path();
                    path.moveTo(event.getX(index), event.getY(index));
                    paths.put(id, path);
                    break;
                case MotionEvent.ACTION_MOVE:
                    for (int i=0; i<event.getPointerCount(); i++) {
                        id = event.getPointerId(i);
                        path = paths.get(id);
                        if (path != null) path.lineTo(event.getX(i), event.getY(i));
                    }
                    break;

                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    path = paths.get(id);
                    if (path != null) {
                        drawCanvas.drawPath(path, drawPaint);
                        paths.remove(id);
                    }
                    setPenEnabled(true);
                    break;
                default:
                    return false;
            }
            invalidate();
            return true;
        }

        /**
         * change path color here
         */
        public void setPathColor(int color) {
            drawPaint.setColor(color);
        }

        //Clear screen
        public void clear() {
            canvasBitmap.eraseColor(Color.TRANSPARENT);
            paths.clear();
            invalidate();
            System.gc();
        }
    }//End of Class

0 个答案:

没有答案