炫酷:一句代码实现标题栏、导航栏滑动隐藏。ByeBurger库的使用和实现
本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。
其实上周五的时候已经发过一篇文章。基本实现了底部导航栏隐藏的效果。但是使用起来可能不是很实用。因为之前我实现的方式是继承了系统的导航栏,并且提供了响应的隐藏显示方法。这样就变相等于强制使用这个view,体验不是很好。所以抽时间把他优化了一下。因为改动比较大,所以重新写一下他的使用方法,当然作为改动补偿,我会在后半篇文章写出他的实现方式。
现在,ByeBuger可以轻易地将任何view在滑动的时候隐藏或者显示。同时支持头部(标题栏)和底部(导航栏)效果。
先看一下全新的效果:


还不错吧。然而,实现这么炫酷的效果,仅仅需要一句代码!
使用
1.在gradle 编译库文件
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
dependencies {
compile 'com.github.githubwing:ByeBurger:1.1.0'
compile 'com.android.support:design:25.0.0'
}
2.你仅仅需要一句代码,对,没错,只需要在你的View上加入一句。
先使用CoordinatorLayout作为根布局,然后向你的**任何**View中插入一句app:layout_behavior属性,即可实现滑动的隐藏和显示。
你的标题栏可以是Toolbar或者LinearLayout或者什么鬼。
同样你的底部导航栏可以是最新的BottomNavigationView亦或者TabLayout在古老一点的RadioButton都可以!
<android.support.design.widget.CoordinatorLayout>
<Viewpager />
<Toolbar
app:layout_behavior="@string/bye_burger_title_behavior"
/>
<BottomTab
android:layout_gravity="bottom"
app:layout_behavior="@string/bye_burger_bottom_behavior"
/>
</android.support.design.widget.CoordinatorLayout>
具体的一句话是:
对于标题栏
app:layout_behavior="@string/bye_burger_title_behavior"
对于底部导航栏
app:layout_behavior="@string/bye_burger_bottom_behavior"
之后你就可以让你的app享受更多的阅读空间啦,相信这给用户带来了极大的便利。
注意
CoordinatorLayout类似于FrameLayout,所以注意xml层次,TitleBar和BottomTab要在xml下方。
只有实现NestScorll接口View的才可以实现监听,例如RecyclerView、NestScrollView.
在ListView下,是不生效的。
以上就是ByeBurger的使用方式,接下来将会介绍ByeBurger的实现方式。如果你只是使用或者不感兴趣就不用往下看啦~~不过我还是建议你看一看,因为知道一个轮子的原理,百利无一害。
实现
0.改名原因
在ByeBurger 1.0版本的时候,其实ByeBurger不叫ByeBurger的,而叫做ByeBurgerNavigationView, 由名字可以看出,他是扩展了系统的BottomNavigationView,可是这样做有许多弊端,比如强制用户使用了某个控件,这样通用性不强。第二,为了用户有更多的选择,加入了头部隐藏效果。所以说,这个项目已经不能被称为NavigationView。于是我将名称进行了修改。
1.历史实现
在1.0版本,我继承了BottomNavigationView。提供了两个方法,一个是show,另一个是hide.
public void show() {
setY(mStartY);
TranslateAnimation ta = new TranslateAnimation(0f, 0f,getMeasuredHeight(),0);
ta.setDuration(300);
ta.setAnimationListener(this);
startAnimation(ta);
}
public void hide() {
setY(mStartY + getMeasuredHeight());
TranslateAnimation ta = new TranslateAnimation(0f, 0f, -getMeasuredHeight(), getMeasuredHeight());
ta.setDuration(300);
ta.setAnimationListener(this);
startAnimation(ta);
}
实际上就是对Y坐标进行了一些处理。给个动画再让他改变他的Y坐标。来达到隐藏效果。(总之隐藏就是让用户看不到)
然后利用Behavior,对NestScroll相关滑动进行监听,来改变ByeBurgerNavigationView的状态。
public class ByeBurgerBehavior extends CoordinatorLayout.Behavior<ByeBurgerNavigationView> {
当然,这是1.0的实现,实用性比较低。所以有了1.1.0版本。
2.更新实现
整体思路就是利用自定义behavior去监听nestScroll的滑动,来让对应的View改变。之前在CoordinatorLayout 自定义Behavior并不难,由简到难手把手带你撸三款! 中介绍过一种Behavior的使用方式,不熟悉的可以先过去看看。这里用到的是第二种,主要是针对NestScroll进行监听。
首先,要自定义一个Behavior,他的泛型,也就是child view为View。 这也保证了它的通用性。
public class ByeBurgerBottomBehavior extends CoordinatorLayout.Behavior<View> {}
其次来处理一下onStartNestedScroll()方法,他提供一个返回值,用于过滤掉滑动事件。这里我们只关心上下滑动。所以应该这样。
@Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child,
View directTargetChild, View target, int nestedScrollAxes) {
return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
最后,在onNestedPreScroll()进行child的对应操作。首先要根据参数dy来判断上下滑动,然后再根据view当前的状态来显示或者隐藏目标View。
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target,
int dx, int dy, int[] consumed) {
//初始化一些参数
if (isFirstMove) {
isFirstMove = false;
mAnimateHelper = AnimateHelper.get(child);
mAnimateHelper.setStartY(child.getY());
mAnimateHelper.setMode(AnimateHelper.MODE_BOTTOM);
}
if (Math.abs(dy) > mTouchSlop) {
if (dy < 0) {
if (mAnimateHelper.getState() == AnimateHelper.STATE_HIDE) {
mAnimateHelper.show();
}
} else if (dy > 0) {
if (mAnimateHelper.getState() == AnimateHelper.STATE_SHOW) {
mAnimateHelper.hide();
}
}
}
}
}
在上面函数里,view的隐藏和显示委托给了AnimateHelper类。这是一个Helper,用来管理View的状态,也就是托付View隐藏或者显示。他的代码很简单,如下:
public class AnimateHelper {
public View mTarget;
public float mStartY;
public static int STATE_SHOW = 1;
public static int STATE_HIDE = 0;
public int mCurrentState = STATE_SHOW;
public int mMode = MODE_TITLE;
public static int MODE_TITLE = 233;
public static int MODE_BOTTOM = 2333;
}
提供一些成员,用于保存 状态,模式,起始Y坐标等等。
提供一个工厂方法,用于获得处理目标view的helper:
public static AnimateHelper get(View target) {
return new AnimateHelper(target);
}
之后,提供show方法和hide方法,用于执行view的隐藏或者显示:
public void show() {
if (mMode == MODE_TITLE) {
showTitle();
} else if (mMode == MODE_BOTTOM) {
showBottom();
}
}
public void hide() {
if (mMode == MODE_TITLE) {
hideTitle();
} else if (mMode == MODE_BOTTOM) {
hideBottom();
}
}
而 showTitle()和 showBottom()之类的如1.0版一样,是改变了一下y坐标,然后执行动画。
如何让用户使用
这里参考了系统预留behavior的使用方式,由于Behavior实例是系统反射出来的,所以需要完整的包名。于是我就将Beavior的包名写在了string.xml里,如下:
<string name="bye_burger_bottom_behavior">com.wingsofts.byeburgernavigationview.ByeBurgerBottomBehavior</string>
<string name="bye_burger_title_behavior">com.wingsofts.byeburgernavigationview.ByeBurgerTitleBehavior</string>
所以用户使用起来及其简便,只需要在xml中给view加入一行代码app:layoutbehavior=”@string/byeburgerbottom_behavior”即可。
以上,ByeBurger库的使用和实现就写完了。终于有机会回馈开源社区了,我感到很开心,哇咔咔。
如果你觉得还不错 欢迎star, 更欢迎贡献代码。
本库下载地址:https://github.com/githubwing/ByeBurger
欢迎加入我的android群:425983695
炫酷:一句代码实现标题栏、导航栏滑动隐藏。ByeBurger库的使用和实现的更多相关文章
- 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前
思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...
- jquery 实现导航栏滑动效果
精简的代码实现导航栏滑动效果,实现详解: 1.滑块位置:通过父节点position=fixed,子节点position=absolute方式,实现子节点浮动: 2.导航栏居中:通过left=0px,r ...
- 微信小程序导航栏,下面内容滑动,上册导航栏跟着滑动,内容随着导航栏滑动
16.类似微信导航栏滑动.png 今日头条导航栏,下面滑动上面跟着滑动 index.wxml <swiper class="content" style="heig ...
- 一款超级炫酷的编辑代码的插件 Power Mode
今天偶尔发现了一款比较炫酷的插件,想让你们看看效果 打代码的时候会有非常炫酷的效果哟 因为我用的编辑器是VScode,所以我也只搞了搞VSCode中使用Power Mode的方法,如果你用的是别的编辑 ...
- Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)
本文同步自wing的地方酒馆 布吉岛大家有木有看这一篇文章,再见,汉堡菜单,我们有了新的 Android 交互设计方案 本库下载地址:https://github.com/githubwing/Bye ...
- sencha touch 扩展官方NavigationView 灵活添加按钮组,导航栏,自由隐藏返回按钮(2014-5-15)
扩展视频讲解:http://www.cnblogs.com/mlzs/p/3652094.html官方NavigationView详解:http://www.cnblogs.com/mlzs/p/35 ...
- sencha touch 自定义cardpanel控件 模仿改进NavigationView 灵活添加按钮组,导航栏,自由隐藏返回按钮(废弃 仅参考)
最新版本我将会放在:http://www.cnblogs.com/mlzs/p/3382229.html这里的示例里面,这里不会再做更新 代码: /* *模仿且改进NavigationView *返回 ...
- MTK Android SwitchPreference(设置-智能辅助-导航栏-导航栏可隐藏)
1.界面布局文件 packages/apps/PrizeSettings/res/xml/navigation_bar_prize.xml ------------------------------ ...
- 通栏导航栏的制作,综合使用CSS属性,代码不超过30行
这篇文章,小编带领大家一同做一个利用CSS技术实现的导航栏.通过这个导航栏的制作,希望大家能够对前几篇文章中学习到的CSS属性能有一个整体的认识,并能够达到灵活运用的程度. 承接文章:灵活控制块级元素 ...
随机推荐
- [Linux]使用awk批量杀进程的命令
碰到需要杀掉某一类进程的时候,如何批量杀掉这些进程,使用awk命令是很好的选择. ps -ef|grep aaa|grep -v grep|awk '{print "kill -9 &quo ...
- 生成器以及yield语句
生成器以及yield语句最初的引入是为了让程序员可以更简单的编写用来产生值的序列的代码. 以前,要实现类似随机数生成器的东西,需要实现一个类或者一个模块,在生成数据的同时 保持对每次调用之间状态的跟踪 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- python九九乘法表
j = 1 while j <= 9: i = 1 while i <= j: print("%d*%d=%d\t" % (i, j, i*j), end=" ...
- 出错信息:Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'username'
出错信息: java.sql.SQLException: Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'username ...
- hibernate--HelloWorld
本次学习版本:hibernate-release-5.2.6.Final,要求java 1.8 和JDBC 4.2. hibernate是一个开放源代码的对象关系映射框架.对JDBC进行了非常轻量的封 ...
- [SHOI2008]循环的债务
Description Alice.Bob和Cynthia总是为他们之间混乱的债务而烦恼,终于有一天,他们决定坐下来一起解决这个问题. 不过,鉴别钞票的真伪是一件很麻烦的事情,于是他们决定要在清还债务 ...
- codeforces 868A Bark to Unlock
As technologies develop, manufacturers are making the process of unlocking a phone as user-friendly ...
- [APIO2016]划艇
题目描述 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 NNN 个划艇学校,编号依次为 111 到 NNN.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇 ...
- Codeforces Round #464 F. Cutlet
Description 题面 有\(2*n\)的时间,去煎一块肉,肉有两面,你需要在特定的时间内翻转,使得每一面都恰好煎了\(n\)分钟,你有\(k\)次翻转的机会,每一次表示为一段时间 \([L_i ...