Cómo saber si Ver dentro de Desplazamiento es visible completamente o no

Hay una vista de desplazamiento entre el encabezado (en la parte superior de la pantalla) y las pestañas (parte inferior de la pantalla). Quiero saber si el ImageView que está dentro del ScrollView está totalmente visible o no en la ventana de pantalla del teléfono.

Introduzca aquí la descripción de la imagen

Yo sugeriría hacer de la siguiente manera (el enfoque es similar a uno en esta pregunta ).

Por ejemplo, usted tiene el siguiente xml (no estoy seguro de lo que son el encabezado y las pestañas por lo que se echan de menos):

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/scroller"> <ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" android:id="@+id/image" android:src="@drawable/image001" android:scaleType="fitXY" /> </ScrollView> 

A continuación, la actividad puede ser similar a la siguiente:

 public class MyActivity extends Activity { private static final String TAG = "MyActivity"; private ScrollView mScroll = null; private ImageView mImage = null; private ViewTreeObserver.OnGlobalLayoutListener mLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { final Rect imageRect = new Rect(0, 0, mImage.getWidth(), mImage.getHeight()); final Rect imageVisibleRect = new Rect(imageRect); mScroll.getChildVisibleRect(mImage, imageVisibleRect, null); if (imageVisibleRect.height() < imageRect.height() || imageVisibleRect.width() < imageRect.width()) { Log.w(TAG, "image is not fully visible"); } else { Log.w(TAG, "image is fully visible"); } mScroll.getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutListener); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Show the layout with the test view setContentView(R.layout.main); mScroll = (ScrollView) findViewById(R.id.scroller); mImage = (ImageView) findViewById(R.id.image); mScroll.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener); } } 

En el caso de la imagen pequeña se registrará: la imagen es totalmente visible.

Sin embargo, debe tener en cuenta la siguiente incoherencia (según mi entendimiento): si tiene una imagen grande, pero realiza la escala (por ejemplo, establece android:layout_width="wrap_content" ) cuando se verá escalado, pero la altura real de ImageView Será como altura completa de la imagen (y ScrollView se desplazará incluso), por lo que adjustViewBounds podría ser necesario. La razón de ese comportamiento es que FrameLayout no se preocupa por layout_width y layout_height de childs .

  • Android TimePicker (Estilo de rueda) no responde correctamente a los gestos de desplazamiento dentro de ScrollView
  • Modo Android Landscape cortando mis botones en la parte superior
  • ¿La lógica detrás de startScroll en scroller?
  • Agregar vistas de forma programática en un diseño (lineal) (que está dentro de un ScrollView)
  • Coloque un bloque en el centro de un ScrollView
  • Problema con webview y scrollview
  • ¿Cómo puedo evitar "IllegalStateException: Scrollview puede alojar sólo un hijo directo"?
  • Desplácese hacia arriba ScrollView lentamente
  • ¿Puedo desplazar un ScrollView de forma programática en Android?
  • Habilitar EditarTexto desplazable dentro de ScrollView y ViewFlipper
  • ScrollView desplazamientos automáticos para seleccionar TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.