Obtención de la coordenada de vista con relativa a ScrollView padre

Anteriormente, tengo el siguiente ScrollView y el diseño. Su desplazamiento hasta el código visible de la vista seleccionada funciona.

 <ScrollView> <LinearLayout> <Info View 1/> <Info View 2/> <Info View 3/> </LinearLayout> </ScrollView> private void initScrollView() { if (this.selectedInfoView == null) { // Nothing to scroll. return; } ScrollView scrollView = (ScrollView)this.getView().findViewById(R.id.scrollView); Rect rect = new Rect(); Rect scrollViewRect = new Rect(); selectedInfoView.getHitRect(rect); scrollView.getDrawingRect(scrollViewRect); int dy = rect.bottom - scrollViewRect.bottom; if (dy > 0) { scrollView.scrollBy(0, dy); } } 

Tenga en cuenta que getHitRect devolverá el respeto de coordenadas a un nivel superior. Por lo tanto, el código anterior funcionará.

Sin embargo, cuando se trata de un caso ligeramente complicado. El código anterior ya no funciona.

 <ScrollView> <LinearLayout 0> <TextView/> <LinearLayout 1> <Info View 1/> <Info View 2/> <Info View 3/> </LinearLayout> <TextView/> <LinearLayout 2> <Info View 4/> <Info View 5/> <Info View 6/> </LinearLayout> </LinearLayout> </ScrollView> 

En mi código, si me encuentro con Info View 1 – 3 , necesito tener en cuenta LinearLayout 0 y LinearLayout 1 's getHitRect . Cuando viene a la visión Info 4 – 6 , necesito tomar la consideración en el getHitRect de LinearLayout 0 y de LinearLayout 2 .

Las cosas se ven engorrosas. ¿Hay alguna forma de obtener la coordenada de una vista, en relación con la parte superior de la mayoría ScrollView ?

Este es el código actualmente disponible. Es engorroso. Pero funciona en este momento. Tengo algunas observaciones.

 private void initScrollView() { if (this.selectedInfoView == null) { // Nothing to scroll. return; } ScrollView scrollView = (ScrollView)this.getView().findViewById(R.id.scrollView); LinearLayout linearLayout = null; if (this.selectedInfo instanceof Info0) { linearLayout = (LinearLayout)this.getView().findViewById(R.id.linearLayout0); } else { assert(this.selectedInfo instanceof Info1); linearLayout = (LinearLayout)this.getView().findViewById(R.id.linearLayout1); } Rect rect = new Rect(); Rect linearLayoutRect = new Rect(); Rect scrollViewRect = new Rect(); selectedInfoView.getHitRect(rect); linearLayout.getHitRect(linearLayoutRect); scrollView.getDrawingRect(scrollViewRect); // Get coordinate relative to linear layout. See the note below. int correct_expected_bottom_y = linearLayoutRect.top + rect.bottom; int dy = correct_expected_bottom_y - scrollViewRect.bottom; if (dy > 0) { scrollView.scrollBy(0, dy); } } 

También probé con getLocationInWindow , getLocationOnScreen y getLocalVisibleRect . Ninguno de ellos a prueba de errores.

(X, y – anchura, altura)

 -------------------- | | (?, 120) <-- correct expected bottom y | | (0, 146) <-- from getLocationInWindow/ getLocationOnScreen | | (0, 0 - 360, 72) <-- from getLocalVisibleRect -------------------- | | (?, 193) <-- correct expected bottom y | | (0, 219) <-- from getLocationInWindow/ getLocationOnScreen | | (0, 0 - 360, 72) <-- from getLocalVisibleRect -------------------- | | (?, 266) <-- correct expected bottom y | | (0, 292) <-- from getLocationInWindow/ getLocationOnScreen | | (0, 0 - 360, 72) <-- from getLocalVisibleRect -------------------- | | (?, 339) <-- correct expected bottom y | | (0, 365) <-- from getLocationInWindow/ getLocationOnScreen | | (0, 0 - 360, 72) <-- from getLocalVisibleRect -------------------- | | (?, 485) <-- correct expected bottom y | [not visible] | (0, 511) <-- from getLocationInWindow/ getLocationOnScreen | | (0, 413 - 360, 485) <-- from getLocalVisibleRect -------------------- 

GetLocationInWindow

Siempre tiene 26 píxeles más que el valor esperado. Por ejemplo, tome la primera fila, 26 = 146 – 120 . Creo que podría ser aportado por ActionBar , o la altura de StatusBar .

GetLocationOnScreen

El mismo comportamiento que getLocationInWindow

GetLocalVisibleRect

Sólo obtiene el mismo valor que el valor esperado, cuando la fila no es visible en la pantalla. No sé por qué. Mire la última fila, donde está teniendo el mismo valor inferior de y (485) como el fondo esperado y.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.