Как прокрутить до центра дочернего элемента HorizontalScrollView?

Мне нужно прокрутить до центра childView (TextView) HorizontalScrollView. У меня есть дочерний центр, используя нижеприведенный код, теперь я хочу настроить стрелку на точный центр этого дочернего представления.

Здесь, что я сделал, я взял HorizontalScrollView и внутри него LineaerLayout, и внутри LinearLayout у меня есть TextViews.

Вот мой 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> 

Я хочу, я хочу, чтобы стрелка была точной в центре TextView, которая появляется в Центре экрана. Как ниже.

Введите описание изображения здесь

То, что я получаю прямо сейчас, это ..

Введите описание изображения здесь

У меня есть центр ребенка, используя следующий код, но теперь мое требование – прокрутить к центру экрана этого ребенка.

Вот мой код:

  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 } }); 

Прежде всего, я вижу, что вы используете TextView для рисования черной линии, вы можете использовать только View.

Поэтому, если мы предположим, что вы создали интерфейс OnScrollStopListener, вы можете использовать следующий код, чтобы получить центр элементов.

  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; } } } }); 

Как вы видите, шаги:

  1. Найдите прокрученный центр ScrollView.
  2. Сканируйте все элементы (childrenView), которые вы хотите центрировать (в этом случае только TextViews).
  3. Проверяйте каждый элемент, если центр scrollview находится внутри границ элемента.
  4. Прокрутите (любым способом, который вы хотите – в этом случае с помощью scrollBy ), в центр элементов и разбейте цикл.

Это сработало для меня:

  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; } }); 

Это сработало для меня:

 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);