我有这个听众:
@Override
public void onClick(View v) {
showDialog();
ImageButton currentButton = (ImageButton)v;
Bitmap bmp = BitmapFactory.decodeFile(mCurrentPhotoPath);
currentButton.setImageBitmap(bmp);
}
图片已在showDialog()
中成功拍摄,但在此之后它不会设为imageButton
。它变白了。生成的路径是:
file:/storage........../filename.jpg
已将其保存在mCurrentPhotoPath
中
我试图在拍摄之后设置来自drawable
的图像以尝试它并且它有效。出于某种原因,我无法将图像设置为ImageButton
。我是否必须调整大小(照片是全尺寸的)?
在THIS教程后我做了这个:
@Override
public void onClick(View v) {
showDialog((ImageButton)v);
setPic((ImageButton)v);
}
private void setPic(ImageButton mImageView) {
if (shotFired){
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath,bmOptions);
mImageView.setImageBitmap(bitmap);
mImageView.setTag(mCurrentPhotoPath);
shotFired=false;
}
似乎我没有重新拍摄setPic()
而只是打电话给那个旧的我已经让它发挥作用。必须是时间安排......我需要让这件事有效。
答案 0 :(得分:1)
我相信你的问题是因为在将内存加载到内存时正常发生的outOfMEmory问题。
在android中加载位图的最佳做法是在加载之前找到位图尺寸。然后加载合适大小的位图取决于您的设备内存大小和屏幕大小。
我强烈建议您阅读这个有关developpe.android网站的精彩教程。这将帮助您全面了解位图的工作原理,并了解加载它们的最佳实践,还包括源代码。请仔细阅读所有这些教程。
https://developer.android.com/training/displaying-bitmaps/index.html
https://developer.android.com/training/displaying-bitmaps/load-bitmap.html
https://developer.android.com/training/displaying-bitmaps/process-bitmap.html
https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
https://developer.android.com/training/displaying-bitmaps/manage-memory.html
https://developer.android.com/training/displaying-bitmaps/display-bitmap.html
我建议您阅读这些链接,但如果您还没有兴趣,可以使用Glide或Piccasso等库来加载您的位图。它们将帮助您在没有OutOfMemoty错误的情况下加载。
答案 1 :(得分:1)
如果您使用相机拍摄照片以将其设置为ImageView,则需要在使用相机拍摄图像后在onActivityResult()中设置图像。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
//set the image to imageView
} else if (resultCode == Activity.RESULT_CANCELED) {
//image was not taken
//show some error message
}
}