当图像被另一个相同大小的图像替换时,ImageView会缩小

时间:2014-02-18 20:52:05

标签: android android-imageview

我在RelativeLayout中有一个imageView,在设计时我从资源加载144x144 png图像,一切看起来都不错:

enter image description here

现在,在代码中,我用相机拍照并将其裁剪为144x144并将其加载到图像视图中:

imageViewMyPicture.setImageBitmap(bitmap);

但现在imageView缩小了:

enter image description here

两张图片都有100%相同的尺寸,144x144,如果我在设计时将第二张图片加载到imageView,则正常加载大小。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

确保在加载图片时考虑到您正在运行的设备的密度。你认为你有144x144,但这可能是原始图像文件,但是当放置在高密度的设备上时,它将被渲染到接近200x200。然后,当您将相机图像剪切为144x144时,您将获得原始尺寸,而不是调整后的密度尺寸。确保您获得该功能的简单方法是使用资源读取图像:

例如,使用此签名加载位图意味着应用程序将以正确的密度读取图像,并为其指定该设备所需的大小。

   selectImg = BitmapFactory.decodeResource(getResources(), R.drawable.drop_device);

答案 1 :(得分:1)

创建缩放位图时需要考虑密度。由于您的ImageView在设置新位图之前具有正确的尺寸,因此您可以在缩放新ImageView时使用Bitmap的尺寸...例如:

我假设您正在使用Uri来从文件系统中检索存储的图像。如果您使用的是File,请使用Uri.fromFile(file)获取Uri。我通常使用AsyncTask来实现这一点,因为你应该对主线程进行位图处理...这里有一些sudo代码(为简单起见,不在AsyncTask中,但很容易重构):

//Somewhere in your Activity

public void scaleAndSetBitmap(ImageView imageView, Uri uri){
            InputStream stream = null;
            Bitmap bitmap = null;

            try { 
             stream = getContentResolver().openInputStream(uri);
             bitmap = BitmapFactory.decodeStream(stream, null, options);

              if (image_view != null && bitmap != null) {
                bitmap = Bitmap.createScaledBitmap(bitmap, image_view.getWidth(), image_view.getHeight(), true);
                image_view.setImageBitmap(bitmap);
              } 
            } catch(Exception e){
                e.printStackTrace();
                return;
            } finally {
                try{
                    stream.close();
                } catch(IOException i){
                    return;
                }
            }
}