我不想用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;
}