Android: Desplazamiento de una vista de imagen

Tengo un ImageView que tiene el doble de altura que una pantalla normale (960 dip). Me gustaría desplazarlo hacia arriba y hacia abajo en la pantalla. La parte inferior de la pantalla debe contener un botón. He probado varias combinaciones de ScrollView e Imageviews sin ningún éxito. También me he adelgazado con el atributo: isScrollContainer sin resultados. Alguien sabe cómo hacer esto? Saludos, Luca

@ cV2 Muchas gracias por ese código. Me puso en marcha en la dirección que necesitaba. Aquí está mi versión modificada que deja de desplazarse en los bordes de la imagen …

// set maximum scroll amount (based on center of image) int maxX = (int)((bitmapWidth / 2) - (screenWidth / 2)); int maxY = (int)((bitmapHeight / 2) - (screenHeight / 2)); // set scroll limits final int maxLeft = (maxX * -1); final int maxRight = maxX; final int maxTop = (maxY * -1); final int maxBottom = maxY; // set touchlistener ImageView_BitmapView.setOnTouchListener(new View.OnTouchListener() { float downX, downY; int totalX, totalY; int scrollByX, scrollByY; public boolean onTouch(View view, MotionEvent event) { float currentX, currentY; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); break; case MotionEvent.ACTION_MOVE: currentX = event.getX(); currentY = event.getY(); scrollByX = (int)(downX - currentX); scrollByY = (int)(downY - currentY); // scrolling to left side of image (pic moving to the right) if (currentX > downX) { if (totalX == maxLeft) { scrollByX = 0; } if (totalX > maxLeft) { totalX = totalX + scrollByX; } if (totalX < maxLeft) { scrollByX = maxLeft - (totalX - scrollByX); totalX = maxLeft; } } // scrolling to right side of image (pic moving to the left) if (currentX < downX) { if (totalX == maxRight) { scrollByX = 0; } if (totalX < maxRight) { totalX = totalX + scrollByX; } if (totalX > maxRight) { scrollByX = maxRight - (totalX - scrollByX); totalX = maxRight; } } // scrolling to top of image (pic moving to the bottom) if (currentY > downY) { if (totalY == maxTop) { scrollByY = 0; } if (totalY > maxTop) { totalY = totalY + scrollByY; } if (totalY < maxTop) { scrollByY = maxTop - (totalY - scrollByY); totalY = maxTop; } } // scrolling to bottom of image (pic moving to the top) if (currentY < downY) { if (totalY == maxBottom) { scrollByY = 0; } if (totalY < maxBottom) { totalY = totalY + scrollByY; } if (totalY > maxBottom) { scrollByY = maxBottom - (totalY - scrollByY); totalY = maxBottom; } } ImageView_BitmapView.scrollBy(scrollByX, scrollByY); downX = currentX; downY = currentY; break; } return true; } }); 

Estoy seguro de que podría ser refinado un poco, pero funciona bastante bien. 🙂

Busqué este Código durante tanto tiempo, así que quería compartir esta gran paz de código:

este código es de una actividad, que tiene un archivo xml en el back-end que contiene un ImageView llamado ‘img’

  

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.xml_name_layout); final ImageView switcherView = (ImageView) this.findViewById(R.id.img); switcherView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View arg0, MotionEvent event) { float curX, curY; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mx = event.getX(); my = event.getY(); break; case MotionEvent.ACTION_MOVE: curX = event.getX(); curY = event.getY(); switcherView.scrollBy((int) (mx - curX), (int) (my - curY)); mx = curX; my = curY; break; case MotionEvent.ACTION_UP: curX = event.getX(); curY = event.getY(); switcherView.scrollBy((int) (mx - curX), (int) (my - curY)); break; } return true; } }); } 

hizo el trabajo perfecto para mí … desplazamiento horizontal y vertical incluido (habilitado)

El único lado negativo es … puedes desplazarte por el borde de la imagen … pero esto no es problema para mí … y dedicar algo de tiempo podrías implementar fácilmente esta función 🙂

buena suerte, diviértete

así es como lo arreglé: p

    

@wirbly Muchas gracias por su código, funciona exactamente de la manera que quiero. Pero cuando leí por primera vez tu código, estaba un poco confundido acerca de las cuatro variables que olvidaste definir.

Entonces, quiero agregar la definición del código para hacerlo más claro.

 Resources res=getResources(); Bitmap mBitmap = BitmapFactory.decodeResource(res, R.drawable.p_1920x1080); BitmapDrawable bDrawable = new BitmapDrawable(res, mBitmap); //get the size of the image and the screen int bitmapWidth = bDrawable.getIntrinsicWidth(); int bitmapHeight = bDrawable.getIntrinsicHeight(); int screenWidth = this.getWindowManager().getDefaultDisplay().getWidth(); int screenHeight = this.getWindowManager().getDefaultDisplay().getHeight(); 

Espero que sea útil.

La manera más fácil es imho de usar una vista web y cargar la imagen en ella a través de un archivo html local. De esta forma, también obtendrá automáticamente los controles de zoom si desea usarlos. Para una imagen grande (es decir, si tiene un ancho de 1000 o 3000 px), notará que Android (Coliris) no es muy bueno para mostrar imágenes ampliadas con gran nitidez, incluso si las imágenes originales son nítidas y sin comprimir. Este es un problema conocido. La solución para eso es descomponer la imagen grande en mosaicos más pequeños y juntarlos de nuevo a través de html (div’s o table). Utilizo este enfoque para proporcionar un mapa del metro (más grande que la pantalla y desplazable) para el usuario.

  WebView webView = (WebView)findViewById(R.id.webView); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setUseWideViewPort(true); webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); webView.loadUrl( "content://com.myapp.android.localfile/sdcard/myappdata/common/mtr_map.html"); 

Esto podría funcionar para la mayoría de los casos / ‘aplicaciones regulares’, aunque depende de su caso particular. Si estás hablando de una imagen como fondo desplazable de un juego, puede que no sea útil para ti.

En lugar de un archivo html, también puede cargar la imagen directamente (png, jpg). Si no quieres el control del zoom, simplemente apágalos.

Otra forma es crear un HorizontalScrollView , agregar el imageView en él y luego agregar el HorizontalScrollView en un ScrollView . Esto le permite desplazarse hacia arriba, abajo, izquierda, derecha.

esto funciona para mi

       

hey guys encontraron una solución fácil y 100% confiable como mencionó anteriormente el Sr. X (ya que los otros códigos mencionados no funcionaban en algunos dispositivos o se rompían) Simplemente use ScrollView provisto por android y se ocupa de las cosas

algo como esto

      

y en oncreate algo como esto

 if (mImageName != null) { InputStream is = null; try { is = this.getResources().getAssets().open("mathematics/"+mImageName); } catch (IOException e) { } Bitmap image = BitmapFactory.decodeStream(is); mImageView.setImageBitmap(image); } 

¡Aclamaciones!