本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。

其实上周五的时候已经发过一篇文章。基本实现了底部导航栏隐藏的效果。但是使用起来可能不是很实用。因为之前我实现的方式是继承了系统的导航栏,并且提供了响应的隐藏显示方法。这样就变相等于强制使用这个view,体验不是很好。所以抽时间把他优化了一下。因为改动比较大,所以重新写一下他的使用方法,当然作为改动补偿,我会在后半篇文章写出他的实现方式。

现在,ByeBuger可以轻易地将任何view在滑动的时候隐藏或者显示。同时支持头部(标题栏)和底部(导航栏)效果。

ByeBurger项目地址

先看一下全新的效果:

还不错吧。然而,实现这么炫酷的效果,仅仅需要一句代码!

使用

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的使用方式,接下来将会介绍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库的使用和实现的更多相关文章

  1. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

  2. jquery 实现导航栏滑动效果

    精简的代码实现导航栏滑动效果,实现详解: 1.滑块位置:通过父节点position=fixed,子节点position=absolute方式,实现子节点浮动: 2.导航栏居中:通过left=0px,r ...

  3. 微信小程序导航栏,下面内容滑动,上册导航栏跟着滑动,内容随着导航栏滑动

    16.类似微信导航栏滑动.png 今日头条导航栏,下面滑动上面跟着滑动 index.wxml <swiper class="content" style="heig ...

  4. 一款超级炫酷的编辑代码的插件 Power Mode

    今天偶尔发现了一款比较炫酷的插件,想让你们看看效果 打代码的时候会有非常炫酷的效果哟 因为我用的编辑器是VScode,所以我也只搞了搞VSCode中使用Power Mode的方法,如果你用的是别的编辑 ...

  5. Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)

    本文同步自wing的地方酒馆 布吉岛大家有木有看这一篇文章,再见,汉堡菜单,我们有了新的 Android 交互设计方案 本库下载地址:https://github.com/githubwing/Bye ...

  6. sencha touch 扩展官方NavigationView 灵活添加按钮组,导航栏,自由隐藏返回按钮(2014-5-15)

    扩展视频讲解:http://www.cnblogs.com/mlzs/p/3652094.html官方NavigationView详解:http://www.cnblogs.com/mlzs/p/35 ...

  7. sencha touch 自定义cardpanel控件 模仿改进NavigationView 灵活添加按钮组,导航栏,自由隐藏返回按钮(废弃 仅参考)

    最新版本我将会放在:http://www.cnblogs.com/mlzs/p/3382229.html这里的示例里面,这里不会再做更新 代码: /* *模仿且改进NavigationView *返回 ...

  8. MTK Android SwitchPreference(设置-智能辅助-导航栏-导航栏可隐藏)

    1.界面布局文件 packages/apps/PrizeSettings/res/xml/navigation_bar_prize.xml ------------------------------ ...

  9. 通栏导航栏的制作,综合使用CSS属性,代码不超过30行

    这篇文章,小编带领大家一同做一个利用CSS技术实现的导航栏.通过这个导航栏的制作,希望大家能够对前几篇文章中学习到的CSS属性能有一个整体的认识,并能够达到灵活运用的程度. 承接文章:灵活控制块级元素 ...

随机推荐

  1. 1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式

    首先我们知道,web api 是可以返回任意类型的,然后在输出的过程中转为(默认的)xml. 但是xml是比较费流量的,而且大多前端都是用json对接,所以我们也只能随大流,把它输出改成json. 不 ...

  2. html标记语言 --文本标记

    html标记语言 --文本标记 二.文本标记 1.h1-h6 标题标记,h1最大 2.font 字体设置标记 2.1 size字体大小.<font size="> 取值范围1-7 ...

  3. Delphi X10.2 + FireDAC 使用 SQL 语句 INSERT

    // CREATE TABLE [tabusers]( // [id] INTEGER PRIMARY KEY AUTOINCREMENT, // [username] CHAR NOT NULL, ...

  4. 招募:Wiki 文档翻译小伙伴招募

    https://github.com/dotnetcore/CAP/issues/93 为了推进 CAP 的国际化工作,为全球其他 .NET 开发者提供更加良好的文档阅读体验,现在需要对CAP wik ...

  5. C#多线程Thread.Join()的详解

    class TestThread { private static void FirstThreadFun() { ; i < ; i++) { Console.WriteLine(Thread ...

  6. further occurrences of HTTP header parsing errors will be logged at DEBUG level.错误

    今天进行项目测试的时候出现了further occurrences of HTTP header parsing errors will be logged at DEBUG level.错误,查了半 ...

  7. [LeetCode] Minimum Genetic Mutation 最小基因变化

    A gene string can be represented by an 8-character long string, with choices from "A", &qu ...

  8. centOS7配置DNS服务器

    世上无难事只怕有心人,遇事千万千万不要抵触,消极的情绪是失败之母,一点一滴,踏踏实实是通往幸福的捷径. 历经激动,受挫,抵触和鼓励以及征服,终于配好了让我欢喜让我忧的dns.在这里记录下来,希望能够给 ...

  9. [Codeforces 873B]Balanced Substring

    Description You are given a string s consisting only of characters 0 and 1. A substring [l, r] of s  ...

  10. 51nod 1770 数数字

    1770 数数字 基准时间限制:1 秒 空间限制:262144 KB 分值: 20 难度:3级算法题  收藏  关注 统计一下 aaa ⋯ aaan个a × b 的结果里面 ...