2013-10-14 59 views
0

它有点难以解释,但生病尝试它。调整ImageView以适合图片

在ImageView中显示图像的Im中,imageview被设置为使用weight属性的50%的ScreenHeight。

现在,如果ImageAspectRatio不符合ImageView的比例,我在ImageView的底部和顶部有一个空的空间。

基本上我希望我的ImageView具有50%的ScreenHeight的maxSize,但如果图像中没有使用它的全高,或者至少移动到ImageView的顶部,则会缩小高度。

所以,我在这里做的是我设置视图的最大尺寸,我设置图像的方式ImageView通常会。之后,我的方式为ImageView布局,然后得到它的高度,因为这是我希望视图具有的最大高度。

然后我计算我需要应用的缩放比例。我缩放图像并将视图设置为包装内容,因为它应该将视图先前的高度作为边界。

现在,这工作正常运行CyagenoMod(Android 4.2.2)的三星GT-I9000也试图在Kindle HD上。但是当在Nexus 4上运行(运行Android 4.3)时,它似乎忽略了我所做的一切。

由此我的意思是,图像看起来可以正确缩放(imageHeight缩放像53x后),但图像几乎需要整个屏幕。我不明白为什么它可以在其他2个设备上工作,但在Nexus上。

是否有任何关于Android 4.3 ImageView的新API我不知道?

@Override 
public void setImageResource(final int resId) { 
    //  this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0, 0.5f)); 
    super.setImageResource(resId); 

    getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { 

     @Override 
     public boolean onPreDraw() { 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId); 

      int width = bitmap.getWidth(); 
      int height = bitmap.getHeight(); 
      int boundingY = getHeight(); 
      int boundingX = getWidth(); 

      float xScale = ((float) boundingX)/width; 
      float yScale = ((float) boundingY)/height; 

      float scale = (xScale <= yScale) ? xScale : yScale; 

      Matrix matrix = new Matrix(); 
      matrix.postScale(scale, scale); 

      Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); 

      MyImageView.this.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT)); 

      MyImageView.super.setImageBitmap(scaledBitmap); 

      getViewTreeObserver().removeOnPreDrawListener(this); 
      return true; 
     } 
    }); 
} 

好吧,这里是什么即时图试图做/做的图片。

resizingImageView

考虑偏蓝事情的ImageView的大小,和黑色矩形,图像的实际大小。蓝色尺寸是我得到的,如果我将ImageView的大小设置为width = matchParent和height = 0,并且权重为0.5。这是我希望ImageView拥有的最大高度。

现在,有可能Image的宽度大于ImageView的宽度。在这种情况下,我想调整高度,以适应图像的高度,所以我调整图像大小,以在这些范围内找到并将图像设置为WrapContent,因为图像是我希望视图的确切大小。

但是这也是可能的一个图像。 2 * width = height 在这种情况下,我不希望ImageView执行任何操作。只需保持其最大高度并显示给出的图像。

这样的工作,正如我在一些设备上已经说过的,GT-I9000和亚马逊Kindle HD,但是在Nexus 4上,具有比宽度高得多的图像倾向于占据整个屏幕。

我调试了这个并检索ImageViewHeight和BitmapHeight。两者都表示Image和ImageView是534 PX高。

我真的不明白为什么我在其他2个设备上工作,但不在联系。

<include layout="@layout/own_action_bar" /> 

<*.view.MyImageView 
    android:id="@+id/drawFragment_iv" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.5" 
    android:adjustViewBounds="true" 
    android:contentDescription="@string/hello" /> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="0.5" > 
something in here 
<RelativeLayout/> 
<LinearLayout/> 
+2

你可以粘贴图像什么是你想要什么,得到的将清除该怎么做的图片 –

+1

http://stackoverflow.com/questions/8232608/fit-image-into-imageview-keep-aspect - 比率和然后调整大小 - imageview-to-image-d?rq = 1 – NitroG42

+0

非常感谢,没有看到,即使我googled了很长一段时间。 –

回答

0

通话setBackgroundResource,而不是setImageResource您的ImageView对象上,它会进行缩放以适合ImageView的图像。

尽管它不是一个有效的方法,但如果没有很多这样的ImageView,这应该可以做到。