如何将绘图恢复到画布java Android Studio

问题描述 投票:0回答:0

我不想用canvas.drawCircle在图片上标记小点,然后用撤消按钮将它们一一还原。

到目前为止,我构建了代码,但是当我单击“撤消”时,图像变得不可用。

我不确定在数组中使用画布层是否正确。

我先用BitmapLayers尝试过,但它需要太多资源,而且根本没有改变图片。

if (requestCode==GALLERY_REQ_CODE) {
                assert data != null;
                imgGallery.setImageMatrix(new Matrix());
                imgGallery.setImageURI(data.getData());
                imgGallery.buildDrawingCache();
                canvasLayers = new ArrayList<>();
                markerStrings = new ArrayList<>();
                Bitmap firstbitmap = imgGallery.getDrawingCache();
                Canvas firstCanvas = new Canvas(firstbitmap);
                canvasLayers.add(firstCanvas);
                queensselected = true;
                workersselected = false;
                broodselected = false;
                radioqueens.setChecked(true);
                radioworkers.setChecked(false);
                radiobrood.setChecked(false);
                queencount = 0;
                workercount = 0;
                broodcount = 0;
                txtQueen.setText("");
                countQueen.setText("");
                txtWorker.setText("");
                countWorker.setText("");
                txtBrood.setText("");
                countBrood.setText("");
                pictureadded = true;
                undoButton.setVisibility(GONE);
            }


undoButton.setOnClickListener(view -> {
            if (!canvasLayers.isEmpty())
            {

                Canvas canvaslast = canvasLayers.get(canvasLayers.size() - 1);
                String stringlast = markerStrings.get(markerStrings.size() - 1 );
                canvasLayers.remove(canvasLayers.size() - 1);
                markerStrings.remove(markerStrings.size() - 1);
                imgGallery.draw(canvaslast);

                if (Objects.equals(stringlast, "Queen")) {
                    queencount--;
                    countQueen.setText(String.valueOf(queencount));
                    Toast.makeText(getApplicationContext(), "Queen removed", Toast.LENGTH_SHORT).show();
                }
                if (Objects.equals(stringlast, "Worker")) {
                    workercount--;
                    countWorker.setText(String.valueOf(workercount));
                    Toast.makeText(getApplicationContext(), "Worker removed", Toast.LENGTH_SHORT).show();
                }
                if (Objects.equals(stringlast, "Brood")) {
                    broodcount--;
                    countBrood.setText(String.valueOf(broodcount));
                    Toast.makeText(getApplicationContext(), "Brood removed", Toast.LENGTH_SHORT).show();
                }

                //If no undos left, hide button
                if (canvasLayers.size() == 1)
                {
                    undoButton.setVisibility(GONE);
                }

            }
        });

@SuppressLint({"ClickableViewAccessibility", "SetTextI18n"})
    public boolean onTouch(View v, MotionEvent event) {
        // handle touch events here
        ImageView view = (ImageView) v;
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            then = System.currentTimeMillis();
        }

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                mode = DRAG;
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist = spacing(event);
                if (oldDist > 10f) {
                   savedMatrix.set(matrix);
                    midPoint(mid, event);
                    mode = ZOOM;
               }
                break;
            case MotionEvent.ACTION_UP:
                int longClickDuration = 2000;
                if ((System.currentTimeMillis() - then) > longClickDuration) {

                    // calculate inverse matrix
                    Matrix inverse = new Matrix();
                    imgGallery.getImageMatrix().invert(inverse);
                    touchPoint = new float[] {event.getX(), event.getY()};
                    inverse.mapPoints(touchPoint);

                    if (pictureadded) {
                    txtQueen.setText("Queen:");
                    countQueen.setText(String.valueOf(queencount));
                    txtWorker.setText("Worker:");
                    countWorker.setText(String.valueOf(workercount));
                    txtBrood.setText("Brood:");
                    countBrood.setText(String.valueOf(broodcount));

                    Bitmap bitmap = imgGallery.getDrawingCache();
                    Canvas drawCanvas = new Canvas(bitmap);
                    Paint paint = new Paint();

                        if (queensselected) {
                            queencount++;
                            countQueen.setText(String.valueOf(queencount));
                            paint.setColor(Color.YELLOW);
                            toast = "Queen marked";
                            markerStrings.add("Queen");
                        }
                        if (workersselected) {
                            workercount++;
                            countWorker.setText(String.valueOf(workercount));
                            paint.setColor(Color.RED);
                            toast = "Worker marked";
                            markerStrings.add("Worker");
                        }
                        if (broodselected) {
                            broodcount++;
                            countBrood.setText(String.valueOf(broodcount));
                            paint.setColor(Color.WHITE);
                            toast = "Brood marked";
                            markerStrings.add("Brood");

                        }
                        drawCanvas.drawCircle(touchPoint[0], touchPoint[1], 10, paint);
                        imgGallery.setImageBitmap(bitmap);
                        canvasLayers.add(drawCanvas);
                        myVib.vibrate(50);
                        undoButton.setVisibility(VISIBLE);
                        Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_SHORT).show();
                        return false;
                    }

                }
                break;
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                break;
            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                    matrix.set(savedMatrix);
                    float dx = event.getX() - start.x;
                    float dy = event.getY() - start.y;
                    matrix.postTranslate(dx, dy);
                }
                else if (mode == ZOOM) {
                    float newDist = spacing(event);
                    if (newDist > 10f) {
                        matrix.set(savedMatrix);
                        float scale = (newDist / oldDist);
                        matrix.postScale(scale, scale, mid.x, mid.y);

                    }
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float scaleX = values[Matrix.MSCALE_X];
                    float scaleY = values[Matrix.MSCALE_Y];

                    if(scaleX <= 1f) {
                        matrix.postScale((1f)/scaleX, (1f)/scaleY, mid.x, mid.y);
                    } else if(scaleX >= 3) {
                        matrix.postScale((3f)/scaleX, (3f)/scaleY, mid.x, mid.y);
                    }
                }
                break;
        }
        view.setImageMatrix(matrix);
        return true;
    }
java android canvas draw
© www.soinside.com 2019 - 2024. All rights reserved.