美文网首页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