HorizontalScrollMoreLayout

需求

最近,一個需求的UI是需要展示在ScrollView里面展示許多橫向排布的圖片,并且,在滑動到第20張的時候,有個View的拉出,提示是否要去查看大圖(類似于listView上拉刷新,但是是橫向的)。

初步實現(xiàn)

其實,最初的想法,就是使用下面的結(jié)構(gòu):

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

去實現(xiàn),然后調(diào)用

horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener();

實現(xiàn)即可,但是后來返現(xiàn)在監(jiān)聽到需要loadMore的時候,發(fā)現(xiàn)會出發(fā)很多次(因為邏輯是getScrollX()>limited)就會當(dāng)做已經(jīng)需要loadMore了。

還是自己實現(xiàn)一下吧

效果圖:

horizontalScrollView

實現(xiàn):

  • 使用scroller進(jìn)行滑動操作;
  • 使用VelocityTracker進(jìn)行慣性滑動;

關(guān)鍵實現(xiàn):

默認(rèn)的loadMoreView的添加

考慮到loadMoreView是需要默認(rèn)實現(xiàn)并添加的,但是何時添加是個問題:

  • 如果在控件初始化的時候,就進(jìn)行初始化,則因為還沒有對控件內(nèi)部的children view進(jìn)行inflate,并不能添加到整個children的最后一個;
  • 如果本來已經(jīng)inflate的layout,之后再代碼中動態(tài)添加View,如何保證每次添加的view都在loadMoreView的前面,已經(jīng)非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);
    }
以后的就比較簡單了,就是監(jiān)控手勢滑動??刂七吔缇托辛恕?/h5>

可在HorizontalScrollMoreLayout處查看完整代碼及Demo。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容