美文网首页Android Tech开发技术Android无止境
【BottomBar】Android炫酷的底部切换效果

【BottomBar】Android炫酷的底部切换效果

作者: Wing_Li | 来源:发表于2016-04-04 17:28 被阅读10443次

如果本文帮助到你,本人不胜荣幸,如果浪费了你的时间,本人深感抱歉。
希望用最简单的大白话来帮助那些像我一样的人。如果有什么错误,请一定指出,以免误导大家、也误导我。
本文来自:http://www.jianshu.com/users/320f9e8f7fc9/latest_articles
感谢您的关注。

**此项目已更新2.0,
新的文章地址为:
**【BottomBar】Android炫酷的底部切换效果V2.0


不过1.0的也可以用,
1.0 的项目地址:https://github.com/roughike/BottomBar/tree/v1

本文是1.0的介绍!!!

显示效果图:

底部画面 在平板上显示会是这个效果 screenshot_tablet.png

特别炫酷,有木有?
代码写起来非常非常简单,超级简单哦。
跟着代码来实现第二张图的效果。也就是上面地址中的代码。


先导包,在Gradle 加上这个:

compile 'com.roughike:bottom-bar:1.3.9'

Maven:

<dependency>
  <groupId>com.roughike</groupId>
  <artifactId>bottom-bar</artifactId>
  <version>1.3.9</version>
  <type>pom</type>
</dependency>
注意:
  1. 最低支持版本是 api 11
  2. 图标必须是完全不透明的,纯色,24dp和无填充。
    <br />

我们来实现第二张图

还是先上步骤:

  1. 创建一个res/menu/bottombar_menu.xml:(也可以用代码来创建)
  1. 在Activity中设置menu,设置点击切换的颜色。
1. 创建一个res/menu/bottombar_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/bb_menu_recents"
        android:icon="@drawable/ic_recents"
        android:title="Recents" />
    <item
        android:id="@+id/bb_menu_favorites"
        android:icon="@drawable/ic_favorites"
        android:title="Favorites" />
    <item
        android:id="@+id/bb_menu_nearby"
        android:icon="@drawable/ic_nearby"
        android:title="Nearby" />
    <item
        android:id="@+id/bb_menu_friends"
        android:icon="@drawable/ic_friends"
        android:title="Friends" />
    <item
        android:id="@+id/bb_menu_food"
        android:icon="@drawable/ic_restaurants"
        android:title="Food" />
</menu>
2. 把下面代码复制进MainActivity
public class MainActivity extends AppCompatActivity {
    private BottomBar mBottomBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

        mBottomBar = BottomBar.attach(this, savedInstanceState);
        mBottomBar.setItems(R.menu.bottombar_menu);
        mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() {
            @Override
            public void onMenuTabSelected(@IdRes int menuItemId) {
                //单击事件 menuItemId 是 R.menu.bottombar_menu 中 item 的 id
            }

            @Override
            public void onMenuTabReSelected(@IdRes int menuItemId) {
                //重选事件,当前已经选择了这个,又点了这个tab。微博点击首页刷新页面
            }
        });
                                
        // 当点击不同按钮的时候,设置不同的颜色
        // 可以用以下三种方式来设置颜色.
        mBottomBar.mapColorForTab(0, ContextCompat.getColor(this, R.color.colorAccent));
        mBottomBar.mapColorForTab(1, 0xFF5D4037);
        mBottomBar.mapColorForTab(2, "#7B1FA2");
        mBottomBar.mapColorForTab(3, "#FF5252");
        mBottomBar.mapColorForTab(4, "#FF9800");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        //保存BottomBar的状态
        mBottomBar.onSaveInstanceState(outState);
    }
}

对没有看错,setContentView 屏掉了,也可以显示出来的。

然后直接去运行一下,就可以看到上面第二张图的效果了。
真的是不要太简单,好吗?

而且,他还有一些更强大的功能。

<br />


为Tab添加标签

像这样:


// 为tab设置一个标签,“信息”提示的数字
// 参数分别是:第几个tab;小圆圈的颜色;显示的数字
BottomBarBadge unreadMessages = mBottomBar.makeBadgeForTabAt(0, "#FF0000", 13);

// 设置显示或隐藏
unreadMessages.show();
unreadMessages.hide();

// 设置显示的数字
unreadMessages.setCount(4);

// 设置显示/消失动画的延迟时间
unreadMessages.setAnimationDuration(200);

// 如果不点它,它一直显示
unreadMessages.setAutoShowAfterUnSelection(true);

<br />


定制Tab的一些属性

// 最开始的第三张图,是平板所显示的,是不是挺丑的?
// 添加这个之后,在手机端 跟平板显示的是一样的。
// 千万注意:这个方法要用在 setItemsFromMenu 之前,也就是tab还没有设置之前要先调用,不然会报错。
mBottomBar.noTabletGoodness();

// 始终显示标题文字,在 setItems() 之前调用
mBottomBar.useFixedMode();

// 使用暗色背景,之前设置的颜色全部失效
mBottomBar.useDarkTheme();

// 为tab设置颜色;(当tabs超过三个时,忽略)
mBottomBar.setActiveTabColor("#009688");

// 为title文字设置样式
mBottomBar.setTextAppearance(R.style.MyTextAppearance);

// 使用自定义的字体,/src/main/assets
// 如果设置样式,先设置样式
mBottomBar.setTypeFace("MyFont.ttf");

<br />


设置 滚动消失

开始的第一张图,底部滚动消失是不是很方便呢?
来看看是怎么实现得到。

在 activity_main.xml 中加入这个

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/myCoordinator"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.v4.widget.NestedScrollView
    android:id="@+id/myScrollingContent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 滚动的内容在这 -->

    </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

MainActivity.java:

// 用attachShy()代替attach(),其余都一样
mBottomBar = BottomBar.attachShy((CoordinatorLayout)findViewById(R.id.myCoordinator),findViewById(R.id.myScrollingContent),savedInstanceState);

是不是挺简单的?

<br />


代码中添加menu

在刚开始是创建了一个 res/menu/bottombar_menu.xml ,当时说了也可以在代码中创建,也就是这样。

mBottomBar.setItems(
  new BottomBarTab(R.drawable.ic_recents, "Recents"),
  new BottomBarTab(R.drawable.ic_favorites, "Favorites"),
  new BottomBarTab(R.drawable.ic_nearby, "Nearby")
);


mBottomBar.setOnTabClickListener(new OnTabClickListener() {
    @Override
    public void onTabSelected(int position) {
      // 单击, position 是点击的位置
    }

    @Override
    public void onTabReSelected(int position) {
      // 重选
    }
});

千万注意,这两种添加方式的监听事件是不太一样的。

  1. 用xml添加时,mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener());
    回调参数的 menuItemId 是 xml 中的 id
  2. 在代码中创建对象添加时,mBottomBar.setOnTabClickListener(new OnTabClickListener());
    回调参数 position 是用户当前所点击的icon在列表中的位置

<br />


因为代码,都特别简单,我就不再传自己的项目了。
基本都是这个项目的内容:https://github.com/roughike/BottomBar
我只是翻译了一遍。

这么炫酷的效果,这么简单的实现,是不是有种立马想试一试的冲动呢?

相关文章

网友评论

  • e3e5895f2b06:若选中时的照片不只是一种颜色比如有渐变色 有白边 反选时时会有一种灰色过度 怎么处理?
  • Android_Romance:使用 underNavbar 这种模式 在华为手机 上 会有一行空白 怎么隐藏空白 有解决方案吗
  • e206c3b457f5:为啥我添加fragment后的布局不能适应屏幕大小了,好纠结,不添加fragment没有问题
  • f674382e9478:如果icon不是加载drawable下的 而是网络图片 该怎么做呢
    c458d50bedd5:@LyonUp 自己写一个imageloader,当网络上面有数据的时候,替换掉数据源不就可以了?
    f674382e9478:@Wing_Li 用的是1.0。 需求是默认icon是加载了drawable下的,等活动期间,从网络上加载相关icon。请问拿到网络图片后,怎么设置到bottombar?
    Wing_Li:这个项目 已经有2.0了,本文是1.0时候的文章,2.0在最开头已经说明了。你是要用1.0,还是2.0?
  • ldlywt:请问 红点大小可以修改吗?
    ldlywt:@Wing_Li 终于发现用 redPonit.setTextSize(8);可以设置了
    Wing_Li:@斥候丶 等周末再重写一篇。
    Wing_Li:@斥候丶 不可以的。还有,这个项目已经更新了,当时写的时候是1.3.0,现在已经2.0.2了。项目地址:https://github.com/roughike/BottomBar
  • suphu:tab已经初始化话,在中途的业务需要改变其中的一个TAB的图片及颜色,BottomBar可以获到指定的tab去修改吗? 还有添加标签的那个提示,可以只是红点吗不显示文字,红点大小可以修改吗? :grin:
  • 视掘:请问Maven在哪里配置?需要导入什么包吗
    Wing_Li:@Luciens 加了 compile 'com.roughike:bottom-bar:1.3.9' 这个就可以了
  • 6d740a060ebd:你好,有个问题不明白。点击 BottomBar 中的 item 时候,怎样设置点击时候 title 出来。默认时候,没有 title,只有 icon。
    Wing_Li:@小刚allen mBottomBar.useFixedMode();的作用是始终显示标题,不管是否超过3个。
    然后,你问的,我没太看明白...... 是:当有5个item时,背景始终是白色?
    6d740a060ebd:@Wing_Li 我发现当 item > 3 的时候,item 的 title 只有在点击的时候才出来。当 item < 3 时候,item 的 title 一直是显示的。

    另外,请问一下,你知道如何设置 Bottombar 白色背景,当点击 item 时候 icon 和 title 变成那种蓝色的吗?当有 5 个 item 时候, 调用 mBottomBar.useFixedMode() 会出现的那种情况。
    Wing_Li:@小刚allen 调这个方法 mBottomBar.useFixedMode();
  • DamonZh:这个怎么实现类似ViewPager那样缓存fragment呢?现在每次切换回原来的fragment的时候都会重新创建一个Fragment
    Wing_Li:@DamonZh 跟之前ViewPager的用法一样啊,为什么会新创建?
  • a460f11452f3::smiley:为啥资源文件png图是黑色的却可以点击图标换颜色
    a460f11452f3:@Wing_Li 好的,谢谢 :smile: ,我还发现我测试机上会有bug 找不到原因
    Wing_Li:@大树底下的苹果 这个目前还没有提供能修改mWhiteColor这个属性的方法(如果有刚需的话,可以把源码改改引入项目),如果这个可以修改的话,应该就可以自定义过滤的色值了。
    Wing_Li:@大树底下的苹果 你这样一问,我才发现这个问题。看源码发现在BottomBar有个mWhiteColor的属性,初始化默认是白色的。如果底部item大于3个的话就调用了 icon.setColorFilter(mWhiteColor);过滤,就是都成白色了。小于三个的话就是黑色。可能是考虑到整个背景色全都改变了,如果每个botton还有颜色,会影响美观。

本文标题:【BottomBar】Android炫酷的底部切换效果

本文链接:https://www.haomeiwen.com/subject/gloulttx.html