在使用HorizontalScrollView我们常常需要让点击的view自动居中,可以用smoothScrollTo(x,y)或者scrollTo(x,y)来实现
这两个方法效果是一样的,只不过smoothScrollTo(x,y)是平滑移动,scrollTo(x,y)是直接跳过去
需要注意的是这两个方法是相对于HorizontalScrollView控件的左边缘(如果是竖向则是上边缘)进行偏移的,x是左边缘向右偏移的距离,y是上边缘向下偏移的距离,本博客仅示范横向偏移,竖向偏移同理。
以下是HorizontalScrollView 的示例,关键代码在getCenterItem()方法里
Android HorizontalScroll 自动居中
<!--这个是在屏幕中画一条竖向中线,用于指示位置--> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:background="#000000" /> <HorizontalScrollView android:id="@+id/horizontalScrollView" android:layout_width="150dp" android:layout_height="70dp" android:layout_centerHorizontal="true" android:scrollbars="none" android:requiresFadingEdge="horizontal" android:fadingEdgeLength="0dp"> <LinearLayout android:id="@+id/horizontalScrollViewItemContainer" android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal" > </LinearLayout> </HorizontalScrollView>
// 初始化布局中的控件 private HorizontalScrollView horizontalScrollView = view.findViewById(R.id.horizontalScrollView); private LinearLayout linearLayout = view.findViewById(R.id.horizontalScrollViewItemContainer); // item的值 private String[] names = new String[]{"刘一", "郑二", "张三", "李四", "王五", "赵六"}; private ArrayList<String> data = new ArrayList<>(); // 将集合中的数据绑定到HorizontalScrollView上 private void bindData(View view) { // 为布局中textview设置好相关属性 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.CENTER; layoutParams.setMargins(20, 10, 20, 10); // 将字符串数组与集合绑定起来 Collections.addAll(data, names); for (int i = 0; i < data.size(); i++){ TextView textView = new TextView(getActivity()); textView.setText(data.get(i)); textView.setTextColor(Color.WHITE); textView.setLayoutParams(layoutParams); textView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { // 手指离开后使当前Item居中 if (event.getAction() == MotionEvent.ACTION_UP) { // 使Item居中 getCenterItem(view); } return true; } }); linearLayout.addView(textView); linearLayout.invalidate(); } } private void getCenterItem(View view) { // 获取horizontalScrollView的宽度 int hsvWidth = horizontalScrollView.getWidth(); // 获取textview左边缘的位置 int textViewLeft = view.getLeft(); // 获取textview Item的宽度 int textViewWidth = view.getWidth(); // 计算偏移量 int offset = textViewLeft + textViewWidth / 2 - hsvWidth / 2; // 横向平滑滚动偏移 horizontalScrollView.smoothScrollTo(offset, 0); // 得到当前居中的Item名字 String s = "CenterLocked Item: "+((TextView)view).getText(); Log.v("performItemClick", s); }