Android HorizontalScrollView 横向滚动自动居中

在使用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);
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页