1. 程式人生 > >android 仿新浪微博發現效果

android 仿新浪微博發現效果

新浪微博發現效果

最開始寫這個效果借鑑過兩個例子,這兩個都有坑,我總結下避免踩坑。

1,自定義 Behavior -仿新浪微博發現頁的實現連結地址:http://blog.csdn.net/gdutxiaoxu/article/details/71732642

     此demo主要是自定義behavior,效果雖然都實現了,但由於父類的攔截,導致頭部部分不能點選事件。有興趣的可以研究學習。

2,利用CoordinatorLayout+AppBarLayout,連結地址:https://www.jianshu.com/p/18363b0ea60f

   這個比上個完善寫,是利用view的隱藏顯示,及清楚和重新賦值AppBarLayout.LayoutParams實現的。

   缺陷:返回動畫並不一樣,頂部view是直接顯示出來的,並沒有動畫效果。

3,思路,可以用nestedscrollview自定義滑動佈局來處理滑動關係。有興趣的可以參考相關文            章:https://www.jianshu.com/p/1806ed9737f6

自己後來根據第二個做了 更改,兩個關鍵地方:

1,利用 recycleview.setNestedScrollingEnabled(false)和recycleview.setNestedScrollingEnabled(true),解除父類的關聯,使頂部view畫出屏幕後不再讓其滑出。這是一個nestedscrollview裡面的機制,有興趣的可以參考相關知識。

2,利用mAppBarLayout.setExpanded(false,false);和mAppBarLayout.setExpanded(true,true);來使其出現推出的動畫效果

下面貼出主要程式碼:

// 初始化AppBarLayout
private void initAppBarLayout() {
    //header layout height
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
    int h = View.MeasureSpec.makeMeasureSpec
(0, View.MeasureSpec.UNSPECIFIED); headerLayout.measure(w, h); int height = headerLayout.getMeasuredHeight(); int width = headerLayout.getMeasuredWidth(); headerHeight = height; ll_top_search_height.post(new Runnable() { @Override public void run() { antionBarSize=ll_top_search_height.getMeasuredHeight(); } }); mAppBarLayout.addOnOffsetChangedListener(onOffsetChangedListener); } AppBarLayout.OnOffsetChangedListener onOffsetChangedListener=new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { verticalOffset = Math.abs(verticalOffset); if (verticalOffset >= headerHeight-antionBarSize) { vp_view.setNoScroll(false); isHideHeaderLayout = true; EventBus.getDefault().post(new MessageEvent<String>("close")); mAppBarLayout.removeOnOffsetChangedListener(onOffsetChangedListener); ll_tab.setVisibility(View.VISIBLE); view_status.setVisibility(View.VISIBLE); mAppBarLayout.setExpanded(false,false); } } }; //記錄使用者首次點選返回鍵的時間 private long firstTime = 0; //首頁top返回監聽 public void backCancle() { //監聽返回鍵 if (isHideHeaderLayout) { vp_view.setNoScroll(true); isHideHeaderLayout = false; EventBus.getDefault().post(new MessageEvent<String>("open")); ll_tab.setVisibility(View.GONE); view_status.setVisibility(View.GONE); mAppBarLayout.setExpanded(true,true); new Handler().postDelayed(new Runnable() { @Override public void run() { mAppBarLayout.addOnOffsetChangedListener(onOffsetChangedListener); } },50); } else { long secondTime = System.currentTimeMillis(); if (secondTime - firstTime > 2000) { Toast.makeText(getActivity(), "再按一次退出程式", Toast.LENGTH_SHORT).show(); firstTime = secondTime; } else { AppManager.getAppManager().finishAllActivity(); System.exit(0); } } } @Override public void onBackPressed() { backCancle(); }