对于我的应用程序我正在创建一个目前正常工作的图像编辑器,但我想实现取消撤销按钮,它基本上回到了图像的先前状态。我试图通过使用位图的ArrayList来做到这一点。首先,我使用此代码从库中打开图像并设置画布:
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
imageFileUri), null, bmpFactoryOptions);
bmpFactoryOptions.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
imageFileUri), null, bmpFactoryOptions);
alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp
.getHeight(), bmp.getConfig());
int x = alteredBitmap.getWidth();
int y = alteredBitmap.getHeight();
if (x > y) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
lscape = true;
} else {
lscape = false;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(5);
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setStyle(Paint.Style.FILL);
String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
Cursor cur = managedQuery(imageFileUri, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
Matrix matrix = new Matrix();
if (orientation!=90) {
matrix.postRotate(orientation);
scaledBitmap = Bitmap.createScaledBitmap(alteredBitmap, width, height, false);
canvas = new Canvas(scaledBitmap);
canvas.drawBitmap(bmp, matrix, paint);
choosenImage.setImageBitmap(scaledBitmap);
choosenImage.setOnTouchListener(this);
b.add(scaledBitmap);
}
在代码的某些方面,我用它画一条直线:
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = event.getX();
downy = event.getY();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
upx = event.getX();
upy = event.getY();
canvas.drawLine(getScaledWidth(downx, width, choosenImage.getWidth()), downy / choosenImage.getHeight() * height, getScaledWidth(upx, width, choosenImage.getWidth()), upy / choosenImage.getHeight() * height, paint);
choosenImage.invalidate();
b.add(scaledBitmap);
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
现在我应该在撤消按钮上为我的onclick写什么?我已经尝试了一切,但不知道如何重置画布以显示在arraylist中保存的位图之一...不知道我的方式将画布设置到位图或者如果我遗漏了某些东西的问题。这是我最近的尝试:
scaledBitmap = b.get(b.size()-2);
b.remove(b.size() - 1);
choosenImage.invalidate();
我是Android开发人员的新手,很抱歉,如果我不清楚,但实际上任何帮助都会受到高度赞赏我会陷入这个项目并且很快就会到期。
提前致谢!
答案 0 :(得分:0)
位图列表 - >内存不足!
位图保存在非常有限的内存区域中,并且为了目的而提供完整的全屏位图列表将使您的应用程序非常快速地耗尽内存。
路径列表 - >更好强>
我为我(非常老的)应用程序" Fingercolors"所做的是保留用户绘制的所有路径的列表。路径由一系列点和一些有关颜色,笔画宽度等信息组成。
对于撤消步骤,我使用空位图启动(屏幕外)并重新绘制列表中除最后一个之外的所有路径,然后显示重建的位图。
这允许无限制的撤销和重做,即使对于具有大量路径的复杂图像,它也足够快。