美文网首页
HorizontalScrollMoreLayout

HorizontalScrollMoreLayout

作者: 美乃滋酱啊 | 来源:发表于2017-01-09 18:31 被阅读34次

    需求

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

    初步实现

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

    <HorizontalScrollView>
     <LinearLayout>
     
     </LinearLayout>
    </HorizontalScrollView>
    

    去实现,然后调用

    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

          本文链接:https://www.haomeiwen.com/subject/lruhbttx.html