From zsml2016(http://blog.csdn.net/qq_29269233)Power byzsml2016侵权必究!
前言:
今天在看Android进阶的书籍,发现越看越有趣,当我看到自动显示、隐藏布局的ListView时,内心充满了好奇和期待,因为即将就要解开我心中当年存在的一个迷,之前我刚接触Android的时候,总是在想为什么淘宝还有京东等一些APP可以实现自动显示和隐藏头布局呢?今天我就发自内心地写这篇博客了!接下来就让带大家见证奇迹的时刻了。
一、首先,给ListView添加一个HeaderView,避免第一个Item被头布局遮挡:
//1.给listview增加HeaderView View header = new View(this); header.setLayoutParams(new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, // 高度根据屏幕不一样,大小不一 // (此处可以使用 R.dimen.abc_action_bar_default_height_material) (int) getResources().getDimension( R.dimen.abc_action_bar_default_height_material))); mlistview.addHeaderView(header);
二、定义变量设置listview最小滑动距离(系统获取的)
//2.获取系统认为的最低滑动距离 minInstance = ViewConfiguration.get(this).getScaledTouchSlop();
三、设置listview的滑动监听事件,比较与上次坐标的大小,即根据坐标差来判断滑动的方向,如果是向上滑动的话就隐藏头布局,向下滑动的话就设置显示头布局:
//3.判断滑动事件 mlistview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mFirstY = event.getY(); break; case MotionEvent.ACTION_MOVE: mCurrentY = event.getY(); if (mCurrentY - mFirstY > minInstance) { status = 0; // 向下 } else { status = 1; // 向上 } if (status == 1) { if (mShow) { barAnim(1); // 隐藏 mShow = false; } } else { if (!mShow) { barAnim(0); // 显示 mShow = true; } } break; } return false; } });
四、最后一步加上头布局的显示、隐藏动画的设置方法:
private void barAnim(int i) { if (animator != null && animator.isRunning()) animator.cancel(); if (i == 0) { animator = ObjectAnimator.ofFloat( titlebar, "translationY", titlebar.getTranslationY(), 0); }else{ animator = ObjectAnimator.ofFloat( titlebar, "translationY", titlebar.getTranslationY(), -titlebar.getHeight()); } animator.start(); }
就是这么简单,向下滑动 ListView ,其顶部布局自动显示;向上滑动 ListView ,其顶部的布局自动隐藏!先给大家看看效果图吧!
到此,大家可以可以简单做个listview去实现一下效果,这里的头文件是用一个Textview写的,如果大家要用toolbar的话,就要注意了,记得主题一定是要NoActionBar的,即:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">