如何滚动到Horizo​​ntalScrollView的孩子的中心?

我需要滚动到Horizo​​ntalScrollView的childView(TextView)的中心。 我已经通过使用下面的代码得到中心的孩子,现在我想调整箭头到该子视图的确切中心。

在这里,我所做的是我拿了一个Horizo​​ntalScrollView,里面有一个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 } }); 

Solutions Collecting From Web of "如何滚动到Horizo​​ntalScrollView的孩子的中心?"

首先我可以看到你用一个TextView画了一条黑线,你可以使用一个View。

所以如果我们假设你创build了一个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. findScrollView的滚动中心。
  2. 扫描你想居中的所有元素(childrenViews)(在这种情况下只有TextViews)。
  3. 如果scrollview的中心位于元素的边界内,则testing每个元素。
  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);