1

我在线性布局上有一个图像视图。

我希望图像视图能够缩放它所持有的位图,因此它在线性布局中占用最大空间,但仍保持适当的图像比例。

  public static void sharedUtilScaleImage(ImageView view)
  {
      Drawable drawing = view.getDrawable();
      //--
      Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
      int bitmapWidth = bitmap.getWidth();
      int bitmapHeight = bitmap.getHeight();
      int widthParent = view.getWidth();      
      int heightParent = view.getHeight();      
      //--
      float density = 1;
      if (true) {
        density = MicApp.getContext().getResources().getDisplayMetrics().density;
      }
      //--
      float xScale = ((float) widthParent * density) / bitmapWidth; 
      float yScale = ((float) heightParent * density) / bitmapHeight;
      float minScale = Math.min(xScale, yScale);  
      //-- 
      Matrix matrix = new Matrix();
      matrix.postScale(minScale, minScale);
      //--
      Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true);
      BitmapDrawable result = new BitmapDrawable(scaledBitmap);
      view.setImageDrawable(result);      
  }

作为参考,我在这里找到了上面的一些代码:http://stackoverflow.com/questions/8114085/how-to-create-white-border-around-bitmap

但是,我觉得上面有点令人费解。

  • 我将所有位图存储在 drawable-hdpi
  • 位图 .getHeight/.getWidth 返回实际像素(而不是密度改变的像素)
  • 但是视图 .getHeight / .getWidth 返回的像素小于手机上的实际像素使用量。我需要将它们与密度相乘以获得实际像素。

为什么返回值的差异?

我喜欢我的位图返回它们的实际像素大小。但是我在其他地方读到需要将它们放在“res/drawable-nodpi”中,所以这似乎是一个额外的不一致?

作为参考,将位图放置在 imageview 中的代码,以及线性布局内的 imageview 如下所示:

imageView.setImageResource(picIDs[position]);                       
imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);        
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);        
imageView.setLayoutParams(lp);                
//--
linearLayoutInner.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
linearLayoutInner.addView(imageView);       
4

3 回答 3

2

似乎您想将图像视图设置为自动调整边界: http: //developer.android.com/reference/android/widget/ImageView.html#setAdjustViewBounds(boolean)并将比例类型设置为 FIT_CENTER

位图有 getScaledWidth 和 getScaledHeight 这将为您提供调整后的尺寸(从您的资源中传递显示指标)视图的 getWidth 和 getHeight 应该给出大小的像素值,但如果父级有任何填充, MATCH_PARENT / FILL_PARENT 将匹配父大小减去填充(或边距)。

于 2013-05-13T10:10:01.287 回答
1

对于您想要原始大小的位图,只需创建文件夹“可绘制”并将它们放在那里。

您缩放图像的代码似乎是正确的,我有一个警告,您的视图仍将与缩放之前的大小相同。因此,如果您定义了某种缩放类型,您可能会有一些视觉副作用,例如图像周围的空白区域或 Android 仍会缩放图像。如果您根据缩放的位图设置视图的大小,则可以避免这种情况。

bitmap = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth() * scaleFactor), (int)(bitmap.getHeight() * scaleFactor), true);
image.setImageBitmap(bitmap);
LayoutParams params = (LayoutParams) image.getLayoutParams();               
params.width = bitmap.getWidth();
params.height = bitmap.getHeight();
image.setLayoutParams(params);

希望这对您有所帮助并享受您的工作。

于 2013-05-15T00:50:21.070 回答
1

有多种方法可以做到:

  1. 使用渲染脚本 - 如果图像很大,它将为您提供非常快速的输出
  2. 使用 java 代码 - 您可以直接通过 2 级的流来完成
  3. 要使其像素完美而不是 dpi - 使用 DisplayMetric 并获取像素和 dpi 之间的相互转换,然后将其应用于位图参考以进行缩放
于 2013-05-12T11:04:29.743 回答