新浪微博发现效果
最开始写这个效果借鉴过两个例子,这两个都有坑,我总结下避免踩坑。
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();
}