Margen redundante al agregar ImageView a ScrollView en Android
He estado intentando utilizar un ScrollView en un solo ImageView con un JPG (~ 770 x 1024) sobre un AVD que es 600×800.
Mi main.xml es:
- Cómo puedo crear un diseño nestedScroll como este?
- Android No se puede eliminar el color en la parte superior e inferior
- distinguir un golpe y hacer clic en android (pasar el evento a otra vista si es un golpe)
- Cómo hacer encabezados de sección pegajosa (como iOS) en Android?
- ScrollView desplazamientos automáticos para seleccionar TextView
<?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>
Ahora, agrego un solo ImageView con
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.
El resultado es La imagen se visualizó en un centro de un ScrollView, envuelto con el área de fondo en la parte superior e inferior como sigue:
| } blank | } Image| . | . : . : : } blank : } ^-scrollbar
En lugar de simplemente
Image| . | . | . | . :
Intenté fijar el fondo del rojo de ImageView, y verificó que los márgenes en blanco eran fondo de ImageView.
iv.setBackgroundColor( color.Red );
Donde esperaría que la imagen no tomara más que su tamaño (escalado al tamaño de AVD) y espero que el ScrollView me permita desplazarme por el resto (si lo hay).
Por alguna razón, veo que el tamaño dibujable es 600×1024.
Por otra parte intenté agregar un LinearLayout con un maniquí opinión del texto tal como el diseño linear es un padre al ImageView y al TextView, y el ScrollView es un padre al 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 );
El resultado fue muy peculiar: todo el diseño se ajustó a la altura de una vista de texto sin texto (19).
______________________ | TITLEBAR | +--------------------+ | []<-image | | height=19px | . . . . +--------------------+
Es importante que evite estirar la imagen. No puedo usar FIT_XY para ScaleType. ¿Cuál es la forma recomendada de implementar una visualización de una página que se puede desplazar potencialmente? ¿Tengo que hacerlo manualmente con un diseño sencillo y desplazamiento sobre eventos GestureDetector.OnScroll ?
Gracias
Shmuel
PS: Otra observación: Con una imagen reducida a 600×780 (escala proporcional) funciona correctamente. Desafortunadamente, para mí no es factible utilizar un conjunto de clones reducidos de las imágenes.
- No estirar ScrollView
- Recylerview no visible dentro de scrollview o nestedScrollview
- Gridlayout + ScrollView
- Cambiar el color de la barra de desplazamiento en Android
- Ajusta scrollview cuando el teclado está hacia arriba
- Gestión de eventos táctiles en ScrollView Android
- Llame a removeView () en el padre del niño primero
- ¿Cómo habilitar Scale en Android ScrollView de una manera que no impide que se desplace y haga clic en sus elementos secundarios?
Añadir esto a su ImageView en el xml:
android:adjustViewBounds="true"
He tenido que hacer algo similar, que creo que debería funcionar en su escenario, pero esto es de mi cabeza sin pruebas, por lo que 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);
No sé de improviso si ScrollView permite desplazamiento tanto horizontal como vertical al mismo tiempo, o si tendría que poner un HorizontalScrollView dentro de un ScrollView, o si eso es posible … pero esto DEBE obtener el correcto Tamaño de ImageView!
Si desea que la imagen llene todo el espacio que usaría ScaleType.CENTER_CROP. Esto cortará el borde izquierdo y derecho de su imagen un poco sin embargo.
Echa un vistazo a este post .
La respuesta oficial es la siguiente:
imgPreview.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imgPreview.setAdjustViewBounds(true);