android 仿新浪微博发现效果

新浪微博发现效果

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