¿Cómo desplazarse al centro del hijo de HorizontalScrollView?

Necesito desplazarme al centro de childView (TextView) de la HorizontalScrollView. Tengo que obtener el centro del niño mediante el uso de código a continuación, ahora quiero ajustar la flecha al centro exacto de esa vista de niño.

Aquí, lo que he hecho es tomé un HorizontalScrollView y dentro de él un LineaerLayout y dentro del LinearLayout tengo TextViews.

Aquí está mi XML:

<com.sample.test.ScrollViewCustom android:id="@+id/mHorizontalScrollViewMain" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/relativeOne" android:background="@drawable/mergethree2" android:scrollbars="none" > <LinearLayout android:id="@+id/llayoutfirst" android:layout_width="wrap_content" android:layout_height="55dip" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtHome" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="home" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtSchools" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="schools" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtCalendar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="calendar" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtActivitiesAndClubs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="activitiesandclubs" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtBoosters" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="boosters" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtSchoolMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="schoolmenu" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtStaff" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="staff" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtMyFavorites" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="myfavorites" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> <TextView android:id="@+id/mtxtAboutContact" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:layout_marginLeft="5dip" android:layout_marginRight="5dip" android:layout_marginTop="8dip" android:text="aboutcontact" android:textColor="@android:color/white" android:textSize="15sp" android:typeface="serif" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dip" android:background="@drawable/blackline" /> </LinearLayout> </com.sample.test.ScrollViewCustom> 

Lo que quiero es, quiero que la flecha exacta en el centro de TextView que viene en el centro de la pantalla. Como abajo.

Introduzca aquí la descripción de la imagen

Lo que recibo ahora es ..

Introduzca aquí la descripción de la imagen

Tengo el centro del niño usando código siguiente pero ahora mi requisito es desplazarse al centro de ese niño de la pantalla.

Aquí está mi código:

  scroll.setOnScrollStopListner(new onScrollStopListner() { @Override public void onScrollStoped() { int scrollX = scroll.getScrollX(); int width = lLayOne.getChildAt(1).getWidth(); int home = width; int school = width * 2; int calender = width * 3; int activityNclubs = width * 4; int booster = width * 5; int schoolMenu = width * 6; int staff = width * 7; int myFav = width * 8; int about = width * 9; if ( scrollX > 0 && scrollX < home ) { Log.d(TAG, "Home "+" scrollx "+scrollX+" home "+home); }else if ( scrollX > home && scrollX < school ) { Log.d(TAG, "school"+" scrollx "+scrollX+" school "+school); }else if ( scrollX > school && scrollX < calender ) { Log.d(TAG, "calender"+" scrollx "+scrollX+" calender "+calender); }else if ( scrollX > calender && scrollX < activityNclubs ) { Log.d(TAG, "activity n clubs"+" scrollx "+scrollX+" activity "+activityNclubs); }else if ( scrollX > activityNclubs && scrollX < booster ) { Log.d(TAG, "booster"+" scrollx "+scrollX+" booster "+booster); }else if ( scrollX > booster && scrollX < schoolMenu ) { Log.d(TAG, "school menu"+" scrollx "+scrollX+" school menu "+schoolMenu); }else if ( scrollX > schoolMenu && scrollX < staff ) { Log.d(TAG, "staff"+" scrollx "+scrollX+" staff "+staff); }else if ( scrollX > staff && scrollX < myFav ) { Log.d(TAG, "myFav"+" scrollx "+scrollX+" fav "+myFav); }else if ( scrollX > myFav && scrollX < about ) { Log.d(TAG, "about"+" scrollx "+scrollX+" about "+about); } // TODO Auto-generated method stub } }); 

3 Solutions collect form web for “¿Cómo desplazarse al centro del hijo de HorizontalScrollView?”

En primer lugar puedo ver que se utiliza un TextView para dibujar una línea negra, puede utilizar sólo una vista.

Por lo tanto, si suponemos que creó una interfaz OnScrollStopListener, puede utilizar el siguiente código para obtener elementos de centro.

  scroll.setOnScrollStopListener(new OnScrollStopListener() { @Override public void onScrollStoped() { //get the center int center = scroll.getScrollX() + scroll.getWidth() / 2; LinearLayout linearLayout = ((LinearLayout)scroll.findViewById(R.id.llayoutfirst)); int chilrenNum = linearLayout.getChildCount(); for (int i = 0; i < chilrenNum; i++) { View v = linearLayout.getChildAt(i); if(v.getClass()!=TextView.class){ // you do no care about that view continue; } int viewLeft = v.getLeft(); int viewWidth = v.getWidth(); if (center >= viewLeft && center <= viewLeft + viewWidth) { Log.d(TAG, "CENTER THIS : " + ((viewLeft + viewWidth / 2) - center)); scroll.scrollBy((viewLeft + viewWidth / 2) - center, 0); break; } } } }); 

Como puede ver los pasos son:

  1. Encuentra el centro desplazado del ScrollView.
  2. Escanee todos los elementos (childrenViews) que desea centrar (en ese caso, sólo TextViews).
  3. Pruebe cada elemento si el centro de scrollview está dentro de los límites del elemento.
  4. Desplácese (en cualquier forma que desee – en ese caso usando scrollBy ) al centro de elementos y romper el bucle.

Esto funcionó para mí:

  SHVradioChannels.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { int center = SHVradioChannels.getScrollX() + SHVradioChannels.getWidth() / 2; LinearLayout linearLayout = ((LinearLayout)SHVradioChannels.findViewById(R.id.LLradioChannels)); int chilrenNum = linearLayout.getChildCount(); for (int i = 0; i < chilrenNum; i++) { View v2 = linearLayout.getChildAt(i); int viewLeft = v2.getLeft(); int viewWidth = v2.getWidth(); if (center >= viewLeft && center <= viewLeft + viewWidth) { SHVradioChannels.scrollBy((viewLeft + viewWidth / 2) - center, 0); break; } } } return false; } }); 

Esto funcionó para mí:

 HorizontalScrollView calendarScroller = (HorizontalScrollView)findViewById(R.id.calendarScroller); Handler handler=new Handler(); Runnable mTabSelector = new Runnable() { public void run() { View tabView = dateScroller.getChildAt(selectedDateIndex);// selected child view final int scrollPos = tabView.getLeft() - (calendarScroller.getWidth() - tabView.getWidth()) / 2; calendarScroller.smoothScrollTo(scrollPos, 0); // mTabSelector = null; } }; handler.postDelayed(mTabSelector, 10); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.