Android HorizontalScrollView 横向滚动自动居中

简介: 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);
}
相关文章
|
5月前
|
XML Java Android开发
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
Android Studio App开发中改造已有的控件实战(包括自定义支付宝月份选择器、给翻页栏添加新属性、不滚动的列表视图 附源码)
48 1
|
5月前
|
Android开发 Kotlin
android开发,使用kotlin学习滚动控件RecyclerView
android开发,使用kotlin学习滚动控件RecyclerView
39 0
|
5月前
|
XML Java Android开发
Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)
Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)
42 0
Android App开发动画特效之利用滚动器实现平滑翻页(附源码和演示 简单易懂)
|
5月前
|
XML Java Android开发
Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
Android Studio App开发中多线程的讲解与实现新闻轮播滚动实战(附源码 超详细必看)
31 0
|
10月前
|
XML Java 程序员
玩转 Android 嵌套滚动
Android 嵌套滚动
112 0
|
Android开发
解决安卓GridView的横向滚动问题
解决安卓GridView的横向滚动问题
120 0
|
Android开发
关于安卓竖直滚动文字自定义控件的探索
安卓竖直滚动文字自定义控件
94 0
关于安卓仿支付宝数字滚动控件的实现
安卓仿支付宝数字滚动控件的实现
273 0
|
Android开发
Android开发 ListView(垂直滚动列表项视图)的简单使用
Android开发 ListView(垂直滚动列表项视图)的简单使用
308 0
Android开发 ListView(垂直滚动列表项视图)的简单使用
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
128 0
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )