NavigationBottomDemo1

本文介绍了一款模仿知乎和掘金客户端底部导航栏的开源项目。提供了详细的配置方法及如何在项目中集成该组件。此外,还展示了如何定义菜单项、设置监听事件等关键步骤。

NavigationBottomDemo1

项目地址: NavigationBottomDemo1
简介:高仿知乎、掘金客户端的底部导航栏

模仿知乎的底部导航栏

加入到你的项目中去

在 Module 下的 build.gradle 中,加上下面这句:

compile 'com.github.youngkaaa:navigation-bottom:1.0.0'

原版如下:

功能介绍:

定义方法:

1> 在 res/menu 文件夹下创建 NavigationBottom 要使用的 menu 文件,如下:
         <menu xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto">
            <item
                android:title="item1"
                app:nb_tabActiveResId="@drawable/doc_active"
                app:nb_tabInActiveResId="@drawable/doc_inactive"
                app:nb_insetLeft="24dp"
                app:nb_insetTop="14dp"
                app:nb_insetRight="24dp"
                app:nb_insetBottom="14dp"
                />
            <item
                android:title="item2"
                app:nb_tabActiveResId="@drawable/find_active"
                app:nb_tabInActiveResId="@drawable/find_inactive" />

            <item
                android:title="item3"
                app:nb_tabActiveResId="@drawable/notification_active"
                app:nb_tabInActiveResId="@drawable/notification_inactive" />

            <item
                android:title="item4"
                app:nb_tabActiveResId="@drawable/message_active"
                app:nb_tabInActiveResId="@drawable/message_inactive" />

            <item
                android:title="item5"
                app:nb_tabActiveResId="@drawable/more_active"
                app:nb_tabInActiveResId="@drawable/more_inactive" />

        </menu>
关于以上属性的介绍:
         android:title : 这是<item>标签中默认必须要写的参数,暂时没用到,可以在类 BottomMenuItem 中通过 getTitle()拿到当前 tab 的 title

         app:nb_tabActiveResId : 为当前 item(即当前 tab)设置当其选中时的图片 id。

         app:nb_tabInActiveResId : 为当前 item(即当前 tab)设置当其未选中时的图片 id。

         app:nb_insetLeft : 设置当前 Item(即当前 tab)的背景图片距离左边缘的距离,具体下面有图解

         app:nb_insetTop : 设置当前 Item(即当前 tab)的背景图片距离上边缘的距离,具体下面有图解

         app:nb_insetRight : 设置当前 Item(即当前 tab)的背景图片距离右边缘的距离,具体下面有图解

         app:nb_insetBottom : 设置当前 Item(即当前 tab)的背景图片距离下边缘的距离,具体下面有图解
注意:
         1) 默认内部的 insetLeft,insetRight,insetTop,insetBottom 默认是 12dp。当你设置了 app:nb_insetLeft 、  app:nb_insetTop 、app:nb_insetRight、nb_insetBottom
         app:nb_insetBottom 时,便以设置的属性大小为准,当没有设置时,以默认值 12dp 为准。
         这样的话,当你设置了图标之后,发现有个别图标和其他不同大小,可以通过以上四个属性来微调指定图标大小,以达到整体一致的目的。

         2) 当你设置的 insetLeft 和 insetRight 之和大于一个 Tab 的宽度时,会抛出异常:IllegalArgumentException (xml attribute of "app:insetLeft" or "app:insetRight" is too large!)

         3) insetTop 和 insetBottom 同理
inset 的图解:


图中 :A、B、C、D 分别对应 insetLeft、nb_insetTop、nb_insetRight、nb_insetBottom (图临时画的,不好看请见谅)

2> 在 xml 文件中使用:
         <com.example.navigationbottom.MyNavigationBottom
            android:id="@+id/navigationBtn1"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:layout_alignParentBottom="true"
            android:background="@color/bottomBg"
            app:nb_xmlResource="@menu/navigation_btn"
            app:nb_defaultIndex="3"
            app:nb_scrollDuration="300"
            app:elevation="8dp">
关于以上属性的介绍:
          app:nb_xmlResource : 为 NavigationBottom 设置 menu 文件资源,即上面定义的 menu 资源 id
          app:nb_defaultIndex : 为 NavigationBottom 设置初始选中的是哪一个 tab。传入 index 即可,index 类似于数组,从 0 开始。不设置该属性时,默认为 0
          app:nb_scrollDuration : 设置当 NavigationBottom 隐藏所需的时间。即可以设置其下降隐藏的速度。不设置该属性时,默认为 500ms
注意:
           MyNavigationBottom 标签中的 layout_width 最好为 match_parent。当为具体大小时,会抛出异常 : IllegalArgumentException (NavigationBottom's width must be match_parent,which couldn't less than screenSize)
           当为 wrap_content 时,内部 onMeasure()中会自动将其调整为 match_parent。
           而对于 layout_height 请不要设置为 match_parent ,设置为具体的数值,比如 48dp

使用方法:

         1) 在 xml 中定义之后,在代码中找到它:
              navigationBottom = (MyNavigationBottom) findViewById(R.id.navigationBtn1);
         2) 然后你可以设置监听事件:

               navigationBottom.setOnTabListener(new OnTabSelectListener() {
                    @Override
                    public void onTabSelected(int index, View view) {
                        Log.d("kklog", "######onTabSelected index=====>" + index + "######");
                        Toast.makeText(MainActivity.this, index + "", Toast.LENGTH_SHORT).show();
                    }
                });

         3) 当然,还有隐藏的方法:
               navigationBottom.hide();
         4)   同理,还有显示的方法:
               navigationBottom.show(); 
         5)   最后,当你需要知道当前选中的是哪一个 tab 时,可以这样做:
               navigationBottom.getSelectedIndex();

         6)   当你想要和 RecyclerView 产生关联时,我的做法是:重写 setOnTouchListener()方法,然后监听 ACTION_MOVE,
              并执行对应操作,我的代码如下,仅供参考:

              recyclerView.setOnTouchListener(new View.OnTouchListener() {
                  @Override
                  public boolean onTouch(View view, MotionEvent motionEvent) {
                      x= (int) motionEvent.getX();
                      y= (int) motionEvent.getY();
                      switch (motionEvent.getAction()){
                          case MotionEvent.ACTION_MOVE:
                              int deltaY=y-lastY;
                              if(deltaY>=0){  //down
                                  navigationBottom.show();
                              }else{  //up
                                  navigationBottom.hide();
                              }
                              break;
                      }
                      lastX=x;
                      lastY=y;
                      return false;
                  } 
              });

运行截图:

下一步

这段时间将加上 Layoutbehavior,让滑动更加舒服。敬请期待!

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索局部开发之间实现平衡。文章详细解析了算法的初始化、勘探开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOAMOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值