Android 如何缩放图像视图/位图和像素与倾斜

Android 如何缩放图像视图/位图和像素与倾斜,android,Android,我有一个线性布局的图像视图 我想让imageview缩放它持有的位图,这样它在线性布局中占用最大的空间,但仍然保持适当的图像比例 public static void sharedUtilScaleImage(ImageView view) { Drawable drawing = view.getDrawable(); //-- Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();

我有一个线性布局的图像视图

我想让imageview缩放它持有的位图,这样它在线性布局中占用最大的空间,但仍然保持适当的图像比例

  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);      
  }
为了便于参考,我在这里找到了上面的一些代码: htttp://stackoverflow.com/questions/8114085/how-to-create-white-border-around-bitmap

然而,我觉得上面有点令人费解

我将所有位图存储在可绘制的hdpi中 位图.getHeight/.getWidth返回实际像素,而不是密度改变的像素 但是view.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);       

有多种方法可以做到这一点:

使用渲染脚本-如果图像很大,它将提供非常快的输出 使用java代码-您可以直接通过规模为2的流执行此操作 要使其达到像素完美而不是dpi,请使用DisplayMetric并获得像素和dpi之间的相互转换,然后将其应用于位图参考以进行缩放
有多种方法可以做到这一点:

使用渲染脚本-如果图像很大,它将提供非常快的输出 使用java代码-您可以直接通过规模为2的流执行此操作 要使其达到像素完美而不是dpi,请使用DisplayMetric并获得像素和dpi之间的相互转换,然后将其应用于位图参考以进行缩放
似乎要将imageview设置为“自动调整边界”:并将比例类型设置为“适合中心”

位图具有getScaledWidth和getScaledHeight,这将为您提供调整后的维度,并从您的资源中传递显示度量
视图的getWidth和getHeight应该给出大小的像素值,但是如果父对象有任何填充,则MATCH_parent/FILL_parent将匹配父对象大小减去填充或边距。

似乎要将imageview设置为自动调整边界:并将缩放类型设置为适合中心

位图具有getScaledWidth和getScaledHeight,这将为您提供调整后的维度,并从您的资源中传递显示度量
视图的getWidth和getHeight应该给出大小的像素值,但是如果父级有任何填充,则MATCH_parent/FILL_parent将匹配父级大小减去填充或边距。

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

缩放图像的代码似乎很正确,我有一个警告,您的视图仍将与缩放前的大小相同。正因为如此,你可能会有一些视觉上的副作用,比如图像周围的空白区域,或者如果你定义了一些缩放类型,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);

希望这有助于您享受工作。

对于您想要原始大小的位图,只需创建“drawable”文件夹并将其放置在那里

缩放图像的代码似乎很正确,我有一个警告,您的视图仍将与缩放前的大小相同。正因为如此,你可能会有一些视觉上的副作用,比如图像周围的空白区域,或者如果你定义了一些缩放类型,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);

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

您有什么理由不在ImageView中使用CENTER_?这并没有缩放图像内部,只是将其居中。我现在也添加了这段代码,所以你可以看到:但即使CENER_INSIDE可以解决我的问题,但在我的测试中,它并没有解决我的问题,我仍然对我的问题感到好奇,因为我想尽可能多地了解Android:你有什么理由不只是在ImageView上使用CENTER_INSIDE?这并没有缩放图像内部,只是将其居中。我现在也添加了代码,所以你可以看到:但是即使CENER_INSIDE可以解决我的问题,而在我的测试中,它没有解决我的问题,我仍然对我的问题感到好奇,因为我想尽可能多地理解Android:我现在的代码可以工作了。我不明白它为什么会起作用。我的问题是:为什么位图.getHeight/.getWidth返回的是实际的像素大小而不是密度改变的像素,而view.getHeight/.getWidth返回的像素比手机上实际使用的像素小得多。i、 我需要将它们与密度相乘以得到实际的像素。因此,还有一些附带的getScaledWidth和getScaledHeight方法,我的代码现在可以工作了。我不明白它为什么会起作用。我的问题是:为什么位图.getHeight/.getWidth返回act
双像素大小,而不是密度改变的像素,但view.getHeight/.getWidth返回的像素比手机上实际使用的像素小得多。i、 我需要将它们与密度相乘以获得实际像素。因此,还有附带的getScaledWidth和getScaledHeight方法,感谢setAdjustViewBounds的链接。这看起来可能会奏效。不过,作为参考,视图没有给出接近正确像素大小的任何地方。我必须将它们与密度相乘才能得到正确的大小。你是在屏幕兼容模式打开的平板电脑上运行你的应用程序吗?我是在三星Galaxy II 4.3英寸上运行的,我想也许我是在考虑View.getMeasuredWidth&Height,而不是getWidth&Heights感谢设置AdjustViewBounds的链接。这看起来可能会奏效。不过,作为参考,视图没有给出接近正确像素大小的任何地方。我必须将它们与密度相乘才能得到正确的大小。你是在屏幕兼容模式打开的平板电脑上运行你的应用程序吗?我是在三星Galaxy II 4.3英寸上运行的,我想也许我想的是View.getMeasuredWidth&Height,而不是getWidth&Height谢谢提示。我明白这是多么有用。不幸的是,对setLayoutParams的最后一次调用似乎被忽略了。不会改变包含位图的imageview的宽度/高度。现在,我设置了一个透明的颜色,但是如果让imageview调整大小会更好,因为这样我就可以开始添加边框/背景或类似的颜色了。谢谢你的提示。我明白这是多么有用。不幸的是,对setLayoutParams的最后一次调用似乎被忽略了。不会改变包含位图的imageview的宽度/高度。现在,我设置了一个透明的颜色,但最好让imageview调整大小,因为我可以开始添加边框/背景或类似的颜色