HorizontalScrollMoreLayout

需求

最近,一个需求的UI是需要展示在ScrollView里面展示许多横向排布的图片,并且,在滑动到第20张的时候,有个View的拉出,提示是否要去查看大图(类似于listView上拉刷新,但是是横向的)。

初步实现

其实,最初的想法,就是使用下面的结构:


 
 
 

去实现,然后调用

horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener();

实现即可,但是后来返现在监听到需要loadMore的时候,发现会出发很多次(因为逻辑是getScrollX()>limited)就会当做已经需要loadMore了。

还是自己实现一下吧

效果图:

horizontalScrollView

实现:

  • 使用scroller进行滑动操作;
  • 使用VelocityTracker进行惯性滑动;

关键实现:

默认的loadMoreView的添加

考虑到loadMoreView是需要默认实现并添加的,但是何时添加是个问题:

  • 如果在控件初始化的时候,就进行初始化,则因为还没有对控件内部的children view进行inflate,并不能添加到整个children的最后一个;
  • 如果本来已经inflate的layout,之后再代码中动态添加View,如何保证每次添加的view都在loadMoreView的前面,已经非loadMoreView们的最后一个。

所以针对上面两个问题,可以使用下面两段代码解决:

  • onFinishInflate()中添加loadMoreView
@Override
 protected void onFinishInflate() {
    super.onFinishInflate();
       if (canLoadMore) {
           View moreView = provideMoreView();
               addView(moreView, -1);
           }
    }
  • 覆写addView()方法,直接添加到指定的位置
 @Override
 public void addView(View child) {
   addView(child, getChildCount() - 1);
    }
以后的就比较简单了,就是监控手势滑动。控制边界就行了。

可在HorizontalScrollMoreLayout处查看完整代码及Demo。

你可能感兴趣的:(HorizontalScrollMoreLayout)