Избыточные поля при добавлении ImageView в ScrollView в Android - PullRequest
5 голосов
/ 08 июня 2010

Я пытался использовать ScrollView для одного ImageView с JPG (~ 770 x 1024) через AVD, который составляет 600x800.

Мой 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 событиях?

Спасибо

Шмуэль

P.S: Еще одно наблюдение: при уменьшении изображения до 600x780 (пропорциональное масштабирование) оно работает правильно. К сожалению, для меня нецелесообразно использовать набор уменьшенных клонов изображений.

Ответы [ 4 ]

16 голосов
/ 22 марта 2012

Добавьте это к вашему ImageView в xml:

android:adjustViewBounds="true"
1 голос
/ 21 апреля 2011

Я должен был сделать что-то похожее, что я считаю, должно работать в вашем сценарии, но это не в моей голове без тестирования, поэтому 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 допускает горизонтальную и вертикальную прокрутку одновременно, или вам нужно будет поместить HorizontalScrollView в ScrollView, или, если это вообще возможно ... но это ДОЛЖНО получить правильный размер ImageView!

0 голосов
/ 21 апреля 2011

Посмотрите на это сообщение .

официальный ответ таков:

imgPreview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
imgPreview.setAdjustViewBounds(true);
0 голосов
/ 08 июня 2010

Если вы хотите, чтобы изображение занимало все пространство, я бы использовал ScaleType.CENTER_CROP. Это немного обрезает левый и правый край вашего изображения.

...