在Android 2.3中编辑位图
我正在Android上制作一个简单的绘图应用程序。我使用ApiDemos示例提供的FingerPaint.java作为基础,添加了一些特性,去掉了其他特性。它基本上创建了一个带有位图的画布,可以在上面绘制 我添加了“打开”和“保存”功能。“保存”功能使用getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)函数将位图存储到文件中,“打开”功能启动startActivityForResult(photoPickerIntent,1)并加载所选图像 问题是我无法在手动打开的位图上绘制。用手指绘图时会显示轨迹,但一旦手指从屏幕上抬起,轨迹就会消失。如果我保存此位图,它将在库中显示为完全未修改。但当启动应用程序时,我可以在画布上画画 我很确定这是一个非常简单的问题,因为我不了解画布和位图是如何工作的。不管怎样,这是我的代码 创建自定义视图时:在Android 2.3中编辑位图,android,canvas,bitmap,Android,Canvas,Bitmap,我正在Android上制作一个简单的绘图应用程序。我使用ApiDemos示例提供的FingerPaint.java作为基础,添加了一些特性,去掉了其他特性。它基本上创建了一个带有位图的画布,可以在上面绘制 我添加了“打开”和“保存”功能。“保存”功能使用getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)函数将位图存储到文件中,“打开”功能启动startActivityForResult(photoPickerIn
public MyView(Context c){
super(c);
mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}
OnDraw覆盖:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
我的“打开”功能:
private void open(){
//checkSD: 1 if read only, 2 if RW
if(checkSD()==1 || checkSD()==2){
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1);
}
}
最后,我的onActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//RequestCode:1 image
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
Uri selectedImage = data.getData();
try{
InputStream fIn = getContentResolver().openInputStream(selectedImage);
mBitmap = BitmapFactory.decodeStream(fIn);
fIn.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
}
mCanvas = new Canvas(mBitmap);
我认为我的错误在这段代码中,但如果有人认为这可能是我实际绘制的方式,我还没有修改FingerPaint.java示例中的touch_xxx和onTouchEvent,因此您可以查看它(或者如果您出于某种原因看不到它,请让我在这里发布)
谢谢 从视图保存图像的另一种方法是在视图上启用图形缓存,当用户单击“保存”时,您可以使用getDrawingCache()获取位图并保存它。好,解决它 我做了两件事。第一个是在onActivityResult中的“fIn.close();”之后添加以下行:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//RequestCode:1 image
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
Uri selectedImage = data.getData();
try{
InputStream fIn = getContentResolver().openInputStream(selectedImage);
mBitmap = BitmapFactory.decodeStream(fIn);
fIn.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
}
mCanvas = new Canvas(mBitmap);
我仍然不太清楚为什么这是必要的,但我知道没有这条线是不行的
我做的第二件事是复制正在加载的位图。结果表明BitmapFactory.decodeStream()返回一个可变位图,为了创建新画布,需要一个可变位图。我在这篇博文中找到了一个很好的解释:
我使用了第二种方法,即将位图复制到新的位图中,如下所示:
mBitmap = mBitmap.copy(Config.ARGB_8888, true);
我从帖子上知道,这不是一种安全的方法,但目前它是有效的
如果我在搜索中使用“inmutable位图”,我就会自己找到答案。无论如何谢谢你 谢谢,但这并不能完全解决问题。问题是,当我使用open函数加载位图时,位图会显示在屏幕上,但我在上面绘制的任何内容都会在我将手指从屏幕上提起时消失。如果单击“保存”,位图将在不进行任何修改的情况下存储,因此我相当确定,存储图像的方式没有问题,而是加载新位图的方式有问题。