android 仿新浪微博发现效果
新浪微博发现效果
最开始写这个效果借鉴过两个例子,这两个都有坑,我总结下避免踩坑。
1,自定义 Behavior -仿新浪微博发现页的实现,链接地址:http://blog.****.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(); }