如何将画布图形转换为图像然后在屏幕上拖动?

时间:2018-08-10 17:08:17

标签: java android

我试图在画布上绘画,然后onClick将其更改为位图图像,然后使其可拖动。我可以在画布上成功绘画 但是如何将此图形转换为图像然后使其可拖动?我不介意是否可以在不转换为图像的情况下拖动绘图。有人可以帮忙吗。

public class MainActivity extends AppCompatActivity implements ColorPickerDialog.OnColorChangedListener {

    protected DrawView canvasView;
    private ImageButton blackCircle;
    private Button pens,select;
    private Paint mPaint;
    Bitmap viewCapture = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPaint = new Paint();

        canvasView = (DrawView) findViewById(R.id.canvas_view);//The drawing mechanism
        colorChanged(mPaint.getColor());

        blackCircle = (ImageButton) findViewById(R.id.black_circle);           
        blackCircle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                canvasView.setPathColor(Color.BLACK));
                blackCircle.setPressed(true);
            }
        });

        select = (Button) findViewById(R.id.ic_select);
        select.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                canvasView.setVisibility(View.VISIBLE);
                canvasView.setPathColor(0);
                //Drag the drawn image
                setContentView(R.layout.activity_main);
                relativeLayout = (RelativeLayout) findViewById(R.id.main);
                drawingView = new DrawingView(MainActivity.this);
                relativeLayout.addView(drawingView);

                //Create a bitmap image of current drawing
                canvasView.setDrawingCacheEnabled(true);
                viewCapture = Bitmap.createBitmap(canvasView.getDrawingCache());
                canvasView.setDrawingCacheEnabled(false);
            }
        });

    }// End of Create();

    private void clearCanvas(View v) {
        canvasView.clear();
    }       

@Override
public void colorChanged(int color) {
    mPaint.setColor(color);
    canvasView.setPathColor(mPaint.getColor());
}


/**************   OnTouch ***************/

class DrawingView extends View{
    float x,y;

    public DrawingView(Context context){
        super(context);
        viewCapture = BitmapFactory.decodeResource(context.getResources(), R.id.main);
    }

    public boolean onTouchEvent(MotionEvent event){
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
            break;
            case MotionEvent.ACTION_MOVE:
                x =(int)event.getX();
                y =(int)event.getY();
                invalidate();
            break;
            case MotionEvent.ACTION_UP:
                x =(int)event.getX();
                y =(int)event.getY();
                invalidate();
            break;
        }
        return true;
    }

    @Override
    public void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.CYAN);
        canvas.drawBitmap(viewCapture, x, y, paint); 
    }
  }
}//End of 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);

    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);
            }
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}

public void setPathColor(int color) {
    drawPaint.setColor(color);
}

public void clear() {
    canvasBitmap.eraseColor(Color.TRANSPARENT);
    paths.clear();
    invalidate();
    System.gc();
 }
}

1 个答案:

答案 0 :(得分:0)

对于接下来的步骤,我假设您想让用户拖动刚用DrawView创建的图片。因此,我将介绍另一个View,它可以显示位图并设置其位置和尺寸,就像DrawView一样。 (实现此目标的最佳方法取决于您使用的ViewGroup的类型)

从画布上创建位图,如converting a canvas into bitmap image in android

使用setBackground(Drawable)将位图设置为新View的背景,并根据需要切换两个View的可见性。

要使新的View可拖动,请使用View.OnTouchListener并根据MotionEvent s更改位置

另一种选择:只需使用标志来拖动DrawView即可指示用户是可以拖动还是在其上绘制。您已经覆盖onTouchEvent(),现在首先检查该标志,如果将其设置为“拖动”,然后评估两个MOVE之间的差异并相应地调整位置。