Избыточная прибыль при добавлении ImageView в ScrollView в Android

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

Мой 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 red, и он подтвердил, что пустые поля были фоном ImageView.

 iv.setBackgroundColor( color.Red ); 

Где бы я ожидал, что изображение займет не больше, чем его размер (масштабируется до размера AVD), и я ожидаю, что ScrollView позволит мне прокрутить остаток (если есть).

По какой-то причине я вижу, что размер для вывода составляет 600×1024.

Кроме того, я попытался добавить 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).

 ______________________ | TITLEBAR | +--------------------+ | []<-image | | height=19px | . . . . +--------------------+ 

Для меня важно избегать растяжения изображения. Я не могу использовать FIT_XY для ScaleType. Каков рекомендуемый способ реализации отображения страницы, которая может быть потенциально прокручена? Должен ли я делать это вручную с помощью простого макета и прокрутки событий GestureDetector.OnScroll ?

благодаря

Шмуэль

PS: Другое наблюдение: при уменьшении изображения до 600×780 (пропорциональное масштабирование) он работает правильно. К сожалению, для меня нецелесообразно использовать набор уменьшенных клонов изображений.

Добавьте это в свой ImageView в xml:

 android:adjustViewBounds="true" 

Я должен был сделать что-то подобное, что, я считаю, должен работать в вашем сценарии, но это не работает, без тестирования, поэтому 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!

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

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

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

 imgPreview.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imgPreview.setAdjustViewBounds(true); 
Intereting Posts