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(); }