5

我一直在尝试在具有 JPG(~770 x 1024)的单个 ImageView 上使用 ScrollView,而不是 600x800 的 AVD。

我的 main.xml 是:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
<ScrollView 
android:id="@+id/scroller"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
/>
</LinearLayout>

现在,我添加了一个 ImageView

setContentView(R.layout.main);
ScrollView sv = (ScrollView)findViewById( R.id.scroller );
ImageView iv = new ImageView(this);
iv.setImageDrawable( new BitmapDrawable( "/sdcard/770x1024.jpg" ) ); // same happens with ScaleDrawable.
iv.setScaleType( ScaleType.CENTER_INSIDE );
sv.addView( sv ); // and it does not go any better if I use Linear Layout between the ScrollView and the ImageView.

结果是图像显示在 ScrollView 的中间,顶部和底部用背景区域包裹,如下所示:

     | } blank
     | }
Image|
.    |
.    :
.    :
     : } blank
     : }
     ^-scrollbar

而不仅仅是

Image|
.    |
.    |
.    |
.    :

我尝试将 ImageView 的背景设置为红色,并验证了空白边距是 ImageView 背景。

iv.setBackgroundColor( color.Red );

我希望图像的大小不超过其大小(缩放到 AVD 大小),并且我希望 ScrollView 让我滚动剩余部分(如果有的话)。

出于某种原因,我看到可绘制尺寸是 600x1024。

此外 ,我尝试添加一个带有虚拟文本视图的 LinearLayout,例如线性布局是 ImageView 和 TextView 的父级,而 ScrollView 是 LinearLayout 的父级。

LinearLayout dummy = new LinearLayout( this );
dummy.addView(iv);
TextView someTextView = new TextView( this );
someTextView.setLayoutParams(new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT ));
dummy.addView( someTextView );
sv.addView( dummy );

结果非常奇特:整个布局设置为无文本文本视图的高度(19)。

______________________
| T I T L E    B A R |
+--------------------+
|         []<-image  |
|        height=19px |
.                    .
.                    .
+--------------------+ 

避免拉伸图像对我来说很重要。我不能将 FIT_XY 用于 ScaleType。实现可滚动页面显示的推荐方法是什么?我是否必须使用简单的布局手动完成并在GestureDetector.OnScroll事件上滚动?

谢谢

什穆尔

PS:另一个观察:将图像缩小到 600x780(按比例缩放),它确实可以正常工作。不幸的是,对我来说,使用一组缩小的图像克隆是不可行的。

4

4 回答 4

16

将此添加到 xml 中的 ImageView 中:

android:adjustViewBounds="true"
于 2012-03-22T16:23:10.090 回答
1

我不得不做类似的事情,我相信应该在你的场景中工作,但这在我没有测试的情况下是我的想法,所以 YMMV:

ImageView iv = new ImageView(this);
Drawable image = new BitmapDrawable("/sdcard/770x1024.jpg");
ScrollView scrollView = (ScrollView)findViewById(R.id.scroller);

int xWidth = image.getIntrinsicWidth();
int yHeight = image.getIntrinsicHeight();

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(xWidth, yHeight);
iv.setLayoutParams(params);
iv.setImageDrawable(image);
iv.setScaleType(ImageView.ScaleType.CENTER);

scrollView.addView(iv);

我不知道 ScrollView 是否允许同时水平和垂直滚动,或者你是否必须在 ScrollView 中放置一个 Horizo​​ntalScrollView,或者如果这甚至可能......但这应该让你正确大小的ImageView!

于 2011-04-21T16:03:26.650 回答
0

如果您希望图像填满整个空间,我会使用 ScaleType.CENTER_CROP。但是,这会稍微裁剪图像的左右边缘。

于 2010-06-08T11:36:35.773 回答
0

看看这篇文章

官方回答是这样的:

imgPreview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imgPreview.setAdjustViewBounds(true);
于 2011-04-21T15:28:10.213 回答