将ImageView缩放到设备宽度

在我的Android应用程序中,我有一个活动,显示具有以下大小244 x 330 。 我想以完整的设备宽度显示这些图像。

我的布局文件如下所示:

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageView android:id="@+id/news_image" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_marginLeft="18dip" android:layout_marginRight="18dip" android:background="#aaaaaa" /> </LinearLayout> </ScrollView> 

我试图设置ImageView的ScaleType,但没有缩放ImageView比例的ScalingType。 如何在横向模式和纵向模式下按比例调整图像以适应整个屏幕?

基本上我想要的就像ScaleType.CENTER_CORP,但它也设置图像的比例高度,所以我可以看到它的所有,而不只是图像的一部分。

编辑因为我知道我很困惑你与我的“怪异”的任务。

我想用图像展示给你。 这是我现在用我的布局得到的。 我想通过按比例缩放图像来填充整个灰色区域。 我怎么能做到这一点?

当我将ScaleType设置为ScaleType ,我得到了这个结果

但是这不是我想要的,因为你没有看到整个形象只是从中心的一部分。

这就是我想要的:

我希望这能帮助你理解我正在努力完成的事情。 任何人都知道如何做到这一点?

编辑2:

它可能看起来很奇怪,有点混乱,我试图显示一个比屏幕大小更高的图像,但因为我在示例布局中使用了ScrollView ,所以应该可以,用户可以滚动,如果他想看到没有显示的区域。

希望这有助于理解我正在尝试做什么。

Solutions Collecting From Web of "将ImageView缩放到设备宽度"

我在ImageView使用fill_parentwrap_content尝试了每个ScaleType ,但是没有一个能够工作。 我也尝试了我在谷歌上find的所有东西,但是没有为我工作,所以我自己想出了一些东西。

很显然,ImageView并不像我想缩放那样缩放我的图像,所以我不得不自己缩放它。 缩放位图后,我将设置新的位图作为ImageView的图像源。 这在G1和摩托罗拉Milestone 2上运行的非常好,看起来非常好。

这里是我的所有代码

布局:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/news_wrapper"> <ImageView android:id="@+id/news_image" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_marginLeft="18dip" android:layout_marginRight="18dip" android:background="#aaaaaa" /> </LinearLayout> </ScrollView> 

活动

 public class ScalingImages extends Activity { private ImageView imageView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_margin); this.imageView = (ImageView)findViewById(R.id.news_image); // The image is coming from resource folder but it could also // load from the internet or whatever Drawable drawable = getResources().getDrawable(R.drawable.img); Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); // Get scaling factor to fit the max possible width of the ImageView float scalingFactor = this.getBitmapScalingFactor(bitmap); // Create a new bitmap with the scaling factor Bitmap newBitmap = Util.ScaleBitmap(bitmap, scalingFactor); // Set the bitmap as the ImageView source this.imageView.setImageBitmap(newBitmap); } private float getBitmapScalingFactor(Bitmap bm) { // Get display width from device int displayWidth = getWindowManager().getDefaultDisplay().getWidth(); // Get margin to use it for calculating to max width of the ImageView LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)this.imageView.getLayoutParams(); int leftMargin = layoutParams.leftMargin; int rightMargin = layoutParams.rightMargin; // Calculate the max width of the imageView int imageViewWidth = displayWidth - (leftMargin + rightMargin); // Calculate scaling factor and return it return ( (float) imageViewWidth / (float) bm.getWidth() ); } } 

Util类

 public class Util { public static Bitmap ScaleBitmap(Bitmap bm, float scalingFactor) { int scaleHeight = (int) (bm.getHeight() * scalingFactor); int scaleWidth = (int) (bm.getWidth() * scalingFactor); return Bitmap.createScaledBitmap(bm, scaleWidth, scaleHeight, true); } } 

如果有一个更好或更准确的方法来完成同样的缩放比例, 请让我知道,因为我不能相信这样一个小事情是很难完成的。

我真的希望看到一个更好的方式来做到这一点。

感谢您的阅读。

最简单的方法是将android:adjustViewBounds =“true”添加到ImageView,并将缩放types设置为“fitCenter”

对你正在寻找的东西稍有困惑。 如果你要缩放以适应屏幕,你有三个select,其中两个是可行的,如果你保持比例。 您可以使用ScaleType fitCenter,这将使图像成比例地在边界范围内,或者您可以使用centerCrop(您说您尝试过),它将拉伸图像的最短的一侧,以适应容器(意味着一些将裁剪掉在较长的维度)。 如果不裁剪或不成比例地拉伸,就不能将其拉伸以适应宽度和高度。

编辑 :好吧,我想我现在得到你的观点。 首先,我将你的LinearLayout设置为wrap_content的高度。 其次,在代码中,可以这样做,我可以想到的一种方法。 也许还有另外一种方法可以做到这一点,首先获得屏幕尺寸,然后用新尺寸做createScaledBitmap ,然后设置背景资源。

 final ImageView newsImage = (ImageView)findViewById(R.id.news_image); //get details on resolution from the display DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); //going to set what happens as the layout happens newsImage.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { int oldHeight, oldWidth, newHeight, newWidth; //we want the new width to be as wide as the screen newWidth = metrics.widthPixels; oldHeight = newsImage.getDrawable().getIntrinsicHeight(); oldWidth = newsImage.getDrawable().getIntrinsicWidth(); //keeping the aspect ratio, the new height should be w1/h1 = w2/h2 newHeight = Math.floor((oldHeight * newWidth) / oldWidth); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)newsImage.getLayoutParams(); params.height = newHeight; params.width = newWidth; newsImage.setLayoutParams(params); newsImage.setScaleType(ScaleType.CENTER); newsImage.invalidate(); newsImage.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } } 

我到处search,找不到解决scheme。 这是我做的,这对我和滚动视图。

XML文件:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" > <ImageView android:id="@+id/manga_page_image" android:layout_width="match_parent" android:layout_height="0dp" android:adjustViewBounds="true" android:scaleType="fitCenter" /> </ScrollView> 

你有没有尝试通过ImageView.setScaleType()编程设置它?

setAdjustViewBounds( false )也可能有帮助。

编辑:对不起,我错读了这个问题。 无论如何, setAdjustViewBounds() 仍然可能有帮助。 从来没有使用它。

我想以完整的设备宽度显示这些图像。

这很简单。 你只是有错误的边距设置。 删除这些行,您的图像将显示在完整的设备宽度:

 android:layout_marginLeft="18dip" android:layout_marginRight="18dip" 

我再也看不到这些图像了,而且问题已经很老了,以防万一别人发现这个问题,并且有同样的问题。 如果得到float screenWidth = getResources().getDisplayMetrics().widthPixels并以编程方式设置ImageView LayoutParamters将图像缩放到screenWidth ,会screenWidth 。 只是一个主意!

设法达到我想要的,希望和你的目标一样:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pgviewer); ImageView PgContainer = (ImageView)findViewById(R.id.imageView1); String Page = String.valueOf(getIntent().getExtras().getInt("Page")); try { PgContainer.setImageBitmap(getBitmapFromAsset(Page)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } PgContainer.setScaleType(ScaleType.FIT_CENTER); PgContainer.scrollTo(0, 0); PgContainer.setScrollBarStyle(0); } 

然后缩放位图:

 private Bitmap getBitmapFromAsset(String strName) throws IOException { AssetManager assetManager = getAssets(); InputStream istr = assetManager.open(strName+".png"); Bitmap bitmap = BitmapFactory.decodeStream(istr); float screenWidth = getResources().getDisplayMetrics().widthPixels; int ih=bitmap.getHeight(); int iw=bitmap.getWidth(); float scalefactor = screenWidth/iw; //w = 480, h=~ //int newh = bitmap.getHeight()/bitmap.getWidth(); return android.graphics.Bitmap.createScaledBitmap(bitmap, (int)(iw*scalefactor), (int)(ih*scalefactor), true); //return bitmap; } 

我曾经用设备分辨率缩放ImageView的设置是关于父级的属性。 所以,随着父母大​​小的变化,元素的大小也会随之变化。 这里是我的activity_main.xml的一个例子

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.csci567.singleimagerequest.MainActivity"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/image_display" android:layout_marginBottom="100dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Upload Image" android:id="@+id/upload_button" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="22dp" /> </RelativeLayout 

你可以通过调整利润来投入更多的元素。