当前位置: 首页 > news >正文

安卓:BottomNavigationBar——底部导航栏控件

目录

一、BottomNavigationBar介绍

二、BottomNavigationBar的常用方法及其常用类

(一)、常用方法

1. 添加菜单项

2. 移除菜单项

3. 设置选中监听器

4. 设置当前选中项 

5. 设置徽章

 6. 样式和颜色定制

7. 动画效果 

8. 隐藏底部导航栏。

 9、设置模式

10.初始化 bottomNavigation

 (二)、常用类

 TextBadgeItem常用方法:

 ShapeBadgeItem常用方法:

三、bottomNavigation的使用例子 

一、BottomNavigationBar介绍

        BottomNavigationBar是一个用于Android应用程序的底部导航栏控件,通常用于在应用程序的不同页面之间进行快速切换。它提供了一种直观且易于使用的导航方式,使用户可以轻松访问应用程序的各个模块。

依赖包:

implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.4'

二、BottomNavigationBar的常用方法及其常用类

(一)、常用方法

        BottomNavigationBar提供了一系列常用的方法,用于定制和管理底部导航栏的外观和行为。以下是BottomNavigationBar的常用方法及其调用例子的详细介绍:

1. 添加菜单项

  • addItem(BottomNavigationItem item):向导航栏添加一个菜单项。

2. 移除菜单项

  • removeItem(int position):从导航栏中移除指定位置的菜单项。

3. 设置选中监听器

  • setOnTabSelectedListener(OnTabSelectedListener listener):设置导航栏的选中监听器。

4. 设置当前选中项 

  • setCurrentItem(int position, boolean animate):设置当前选中的菜单项。
  • setFirstSelectedPosition(int position):设置默认选中项。

5. 设置徽章

  • setNotification(String text, int position):在指定位置的菜单项上显示徽章。
  • removeNotification(int position):移除指定位置菜单项上的徽章。

 6. 样式和颜色定制

  • setBackgroundStyle(int backgroundStyle):用于设置底部导航栏的背景样式。
  • setDefaultBackgroundColor(int color):设置导航栏的默认背景颜色。
  • setAccentColor(int color):设置选中项的颜色。
  • setInactiveColor(int color):设置未选中项的颜色。
  • setTitleState(int state):设置标题的显示方式,可选值有STATE_ALWAYS_SHOW、STATE_ALWAYS_HIDE和STATE_SHOW_WHEN_ACTIVE。
  • setTitleTextSize(int textSize):设置标题的字体大小。

7. 动画效果 

  • setColored(boolean colored):设置是否启用选中项的颜色动画效果。
  • setBehaviorTranslationEnabled(boolean enabled):设置是否启用底部导航栏的滑动效果。

8. 隐藏底部导航栏。

  • hideBottomNavigation(boolean hide):显示或隐藏底部导航栏。

 9、设置模式

  • setMode(int mode) :
  1. MODE_FIXED:固定模式

    • 当导航栏的菜单项个数小于等于3个时,推荐使用此模式。
    • 在固定模式下,所有的菜单项会平均分布在底部导航栏中,且大小相等。
  2. MODE_SHIFTING:移动模式

    • 当导航栏的菜单项个数大于3个时,推荐使用此模式。
    • 在移动模式下,当前选中的菜单项会突出显示,而其他未选中的菜单项则会缩小并向上移动。

10.初始化 bottomNavigation

  •  initialise():用于完成底部导航栏的初始化。

 (二)、常用类

  1. BottomNavigationBar:底部导航栏的主要类,用于创建和管理底部导航项。通过该类,可以设置导航栏的模式、背景样式、菜单项等属性,并监听导航项的选中事件。
  2. BadgeItem:角标类,用于在导航栏的菜单项上显示角标。它有两个子类:TextBadgeItem用于在菜单项上显示文本角标。ShapeBadgeItem用于在菜单项上显示形状角标,如圆形、方形等。 
  3. BottomNavigationItem:底部导航项的类,用于创建每个菜单项。通过该类,可以设置图标、标题和选中状态的图标。
  4. OnTabSelectedListener:底部导航栏的选项卡选中监听器接口。通过实现该接口,可以监听到选项卡的选中事件,并在相应的回调方法中进行处理。
  5. BadgeAnimation角标动画类,用于定义角标的出现和消失动画效果。

 TextBadgeItem常用方法

  • setText(String text):设置角标上显示的文本内容。
  • setBackgroundColor(int color):设置角标的背景颜色。
  • setTextColor(int color):设置角标文本的颜色。
  • setHideOnSelect(boolean hideOnSelect):设置是否在选中菜单项时隐藏角标,默认为false。
  • setAnimationDuration(long duration):设置角标动画的持续时间,单位为毫秒。
  • show()hide():手动显示和隐藏角标。 
  •  setShape(Shape shape):设置角标的形状。

 ShapeBadgeItem常用方法

  • setIconDrawable(Drawable icon):设置菜单项的图标。
  • setInactiveIconDrawable(Drawable icon):设置菜单项的非选中状态的图标。 
  • setText(String text):设置菜单项的文本内容。
  •  setInactiveColor(int color):设置菜单项的非选中状态的颜色。
  • setActiveColor(int color):设置菜单项的选中状态的颜色。
  • setBadgeItem(BadgeItem badgeItem):为菜单项设置角标。

三、bottomNavigation的使用例子 

MainActivity: 

package com.example.bottomnavigationbardemo;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;import com.ashokvarma.bottomnavigation.BottomNavigationBar;
import com.ashokvarma.bottomnavigation.BottomNavigationItem;
import com.ashokvarma.bottomnavigation.ShapeBadgeItem;
import com.ashokvarma.bottomnavigation.TextBadgeItem;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity implements BottomNavigationBar.OnTabSelectedListener {private FragmentManager mFragmentManager;private BottomNavigationBar mBottomNavigationBar;TextBadgeItem mTextBadgeItem;ShapeBadgeItem mShapeBadgeItem;private FirstFragment firstFragment;private SecondFragment secondFragment;private ThirdFragment thirdFragment;private FragmentTransaction transaction;int curPosition;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mBottomNavigationBar = findViewById(R.id.bottom_navigation_bar);initBottomNavigationBar();}private void initBottomNavigationBar() {// 设置固定模式mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);// 设置点击事件mBottomNavigationBar.setTabSelectedListener(this);List<BottomNavigationItem> items= getBottomNavigationItem();mBottomNavigationBar.addItem(items.get(0)).setFirstSelectedPosition(0).addItem(items.get(1)).addItem(items.get(2))// 此方法应在所有自定义方法结束时调用。此方法将考虑所有更改并重新绘制选项卡。.initialise();setDefaultFragment();}private List<BottomNavigationItem> getBottomNavigationItem() {initBadgeItem();// 用来存item的集合List<BottomNavigationItem> items = new ArrayList<>();// 创建Item1BottomNavigationItem homeItem = new BottomNavigationItem(R.drawable.home,"首页");// 设置被点击时的颜色homeItem.setActiveColor(R.color.purple_500).setBadgeItem(mShapeBadgeItem);// 设置没有被点中的颜色
//        homeItem.setInActiveColor(R.color.teal_200);// 设计没有被点中时的图片资源
//        homeItem.setInactiveIconResource(R.drawable.ic_launcher_foreground);items.add(homeItem);// 创建Item2BottomNavigationItem messageItem = new BottomNavigationItem(R.drawable.message,"信息");// 设置被点击时的颜色设置没有被点中的颜色messageItem.setActiveColor(R.color.purple_500)
//        .setInActiveColor(R.color.teal_200).setBadgeItem(mTextBadgeItem);//        .setInactiveIconResource(R.drawable.ic_launcher_foreground);items.add(messageItem);// 创建Item2BottomNavigationItem personage = new BottomNavigationItem(R.drawable.person,"个人信息");// 设置被点击时的颜色设置没有被点中的颜色personage.setActiveColor(R.color.purple_500);
//                .setInActiveColor(R.color.teal_200)
//                .setInactiveIconResource(R.drawable.ic_launcher_foreground);items.add(personage);return items;}/*** 设置徽章*/private void initBadgeItem() {mTextBadgeItem = new TextBadgeItem();mTextBadgeItem.setText("99+").setTextColor("#ffffff").setBorderWidth(5).setBackgroundColor("#ff4083").setHideOnSelect(false); // 选中是否隐藏
//                .setGravity(Gravity.TOP); // 设置位置mShapeBadgeItem = new ShapeBadgeItem();mShapeBadgeItem.setShape(ShapeBadgeItem.SHAPE_OVAL).setShapeColor(Color.RED).setEdgeMarginInDp(this,0) // 距离item的边距,dP.setSizeInDp(this, 15, 15) //宽高值,dp.setHideOnSelect(false).setAnimationDuration(300); //隐藏和展示的动画速度,单位毫秒,和setHideOnSelect一起使用}/*** 设置默认开启的fragment*/private void setDefaultFragment() {mFragmentManager = getSupportFragmentManager();FragmentTransaction transaction = mFragmentManager.beginTransaction();firstFragment = new FirstFragment();transaction.add(R.id.tb, firstFragment);transaction.commit();}/*** 隐藏当前fragment** @param transaction*/private void hideFragment(FragmentTransaction transaction) {if (firstFragment != null) {transaction.hide(firstFragment);}if (secondFragment != null) {transaction.hide(secondFragment);}if (thirdFragment != null) {transaction.hide(thirdFragment);}}@Overridepublic void onTabSelected(int position) {curPosition = position;//每次点击赋值//开启事务transaction = mFragmentManager.beginTransaction();// 隐藏当前的fragmenthideFragment(transaction);switch (position) {case 0:if (firstFragment == null) {firstFragment = new FirstFragment();transaction.add(R.id.tb, firstFragment);} else {transaction.show(firstFragment);}// transaction.replace(R.id.tb, firstFragment);break;case 1:if (secondFragment == null) {secondFragment = new SecondFragment();transaction.add(R.id.tb, secondFragment);} else {transaction.show(secondFragment);}break;case 2:if (thirdFragment == null) {thirdFragment = new ThirdFragment();transaction.add(R.id.tb, thirdFragment);} else {transaction.show(thirdFragment);}break;}// 事务提交transaction.commit();}@Overridepublic void onTabUnselected(int position) {// 没有被选中时,调用该方法}@Overridepublic void onTabReselected(int position) {// 再次选中时,调用此方法}}

代码解析:

MainActivity 类是一个包含底部导航栏的活动。在 onCreate() 方法中,通过调用 initBottomNavigationBar() 初始化了底部导航栏。

initBottomNavigationBar() 方法中:

  • 设置了底部导航栏的模式为 MODE_SHIFTING,表示选项卡会随用户的点击而移动。
  • 设置了底部导航栏的点击事件监听器为当前活动(this)。
  • 调用 getBottomNavigationItem() 方法获取底部导航栏的选项卡集合,并添加到底部导航栏中。
  • 调用 initialise() 方法完成底部导航栏的初始化,并设置默认显示的片段。

getBottomNavigationItem() 方法中:

  • 创建了三个底部导航栏的选项卡 BottomNavigationItem
  • 分别设置了选项卡的图标、文字、被点击时的颜色、未被点击时的颜色和未被点击时的图标资源。
  • 将选项卡添加到一个列表中并返回。

除此之外,还定义了其他方法:

  • initBadgeItem():初始化了两个徽章(TextBadgeItem 和 ShapeBadgeItem),并设置其属性。
  • setDefaultFragment():设置默认显示的片段为 FirstFragment
  • hideFragment(FragmentTransaction transaction):隐藏当前显示的片段。
  • onTabSelected(int position):处理选项卡被选中的事件,根据位置切换不同的片段。
  • onTabUnselected(int position):处理选项卡取消选中的事件。
  • onTabReselected(int position):处理选项卡再次被选中的事件。

总结:该代码是一个包含底部导航栏的活动,通过点击底部选项卡来切换显示不同的片段。可以根据需要修改底部导航栏的样式、添加更多的选项卡和设置对应的片段。

 FirstFragment :

package com.example.bottomnavigationbardemo;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;public class FirstFragment extends Fragment {@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.activity_first_fragment, container, false);return view;}
}

 activity_first_fragment:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第一个Fragment"android:textSize="30sp" />
</LinearLayout>

activity_main: 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"android:orientation="vertical"><FrameLayoutandroid:id="@+id/tb"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><Viewandroid:layout_width="match_parent"android:layout_height="0.5dp"android:background="#eeeeee" /><com.ashokvarma.bottomnavigation.BottomNavigationBarandroid:id="@+id/bottom_navigation_bar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom" /></LinearLayout>

注意: SecondFragment、ThirdFragment和FirstFragment的代码一样,其布局文件也跟activity_first_fragment一样。

运行效果:

 

 

 四、总结

        BottomNavigationBar(底部导航栏)是一种常见的用户界面设计模式,常用于移动应用程序中。下面是 BottomNavigationBar 的优点和缺点的总结:

优点:

1. 提供直观的导航:底部导航栏通常位于屏幕底部,使用户可以轻松访问主要功能和导航选项。这种布局方式更符合用户的自然操作习惯,提供了直观的导航体验。
2. 节省屏幕空间:将导航选项放置在底部,可以节省屏幕顶部的空间,更多地用于显示应用程序的内容。尤其对于大屏幕设备,这种设计可以更好地利用屏幕空间。
3. 易于使用手指操作:由于底部导航栏靠近手指自然的位置,用户可以轻松地使用拇指进行导航,而无需频繁改变手持设备的姿势。
4. 强调当前位置:通过高亮显示当前活动或选中的导航选项,底部导航栏可以帮助用户更清楚地知道自己所处的位置,并提供上下文导航。

缺点:

1. 屏幕空间限制:虽然底部导航栏节省了屏幕顶部的空间,但它也会占用屏幕底部的一定高度。对于某些应用程序而言,这可能会减少可用的内容显示区域。
2. 选项数量限制:底部导航栏通常适用于不超过五个主要功能或导航选项的应用程序。如果选项过多,可能会导致导航栏变得拥挤,难以识别和操作。
3. 设计一致性:底部导航栏是一种常见的设计模式,但并不适用于所有应用程序。在选择使用底部导航栏时,需要确保它与应用程序的整体设计风格和用户期望一致。

        综上所述,BottomNavigationBar 提供了直观、节省空间和易于操作的优点,但也存在屏幕空间限制和选项数量限制等一些缺点。在设计应用程序时,需要仔细考虑是否采用底部导航栏,并确保与应用程序的整体设计一致。

 

相关文章:

安卓:BottomNavigationBar——底部导航栏控件

目录 一、BottomNavigationBar介绍 二、BottomNavigationBar的常用方法及其常用类 &#xff08;一&#xff09;、常用方法 1. 添加菜单项 2. 移除菜单项 3. 设置选中监听器 4. 设置当前选中项 5. 设置徽章 6. 样式和颜色定制 7. 动画效果 8. 隐藏底部导航栏。 9、设…...

十、用 ChatGPT 辅助写文章

目录 一、实验介绍 二、背景 三、ChatGPT 写作方式 3.1 传统写作方式 3.2 ChatGPT 写作方式...

计算机毕设 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…...

60多行代码仿制B站首页一个好看的卡片效果

文章目录 1、为啥是这个&#xff1f;2、仿制效果3、实现思路4、代码5、查看B站如何实现 1、为啥是这个&#xff1f; 看到Bilibili首页的一个卡片&#xff0c;看着效果很不错&#xff0c;给人很舒适的感觉。一琢磨貌似也不难&#xff0c;甚至只需要一层 div 就可以实现主要框架…...

Redis内网主从节点搭建

Redis内网主从节点搭建 1、文件上传2、服务安装3、服务启动4、配置主从复制 1、文件上传 内网环境手动上传gcc-c、redis.tar文件 2、服务安装 # 解压 unzip gcc-c.zip unzip gcc_rpm.zip tar -zxvf redis-6.2.13.tar.gz# 安装 cd gcc_rpm/ rpm -ivh *.rpm --nodeps --force…...

ESP32-C2开发板 ESP8684芯片 兼容ESP32-C3开发

C2是一个芯片采用4毫米x 4毫米封装&#xff0c;与272 kB内存。它运行框架&#xff0c;例如ESP-Jumpstart和ESP造雨者&#xff0c;同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统&#xff0c;受到了全球用户的信赖。它由支持Espressif以及所有…...

Zebec 创始人 Sam 对话社区,“Zebec 生态发展”主题 AMA 回顾总结

近日&#xff0c;Zebec Protocol 创始人 Sam 作为嘉宾&#xff0c;与社区进行了以“Zebec 生态发展”为主题的 AMA 对话。Sam 在线上访谈上对 Zebec 路线图、Zebec 质押、NautChain通证进行了解读&#xff0c;并对 Zebec 的进展、生态建设的愿景进行了展望。本文将对本次 AMA 进…...

一台电脑给另外一台电脑共享网络

这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网&#xff0c;勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww&#xff0c;设置如下。 …...

AAA 认证

概念 AAA是认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;和计费&#xff08;Accounting&#xff09;的简称&#xff0c;是网络安全中进行访问控制的一种安全管理机制&#xff0c;提供认证、授权和计费三种安全服务。 AAA 常见架构...

jvm-程序计数器

1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器&#xff0c;cpu中读取速度…...

NestJs Debug配置文件

&#xff08;事缓则圆,人缓则安,语迟则贵,虎行似病,鹰立似睡。清俞万春《荡寇志》&#xff09; {"version": "0.2.0","configurations": [{"type": "node","request": "launch","name": &quo…...

题解 | #C.idol!!# 2023牛客暑期多校6

C.idol!! 数学 题目大意 正整数 n n n 的双阶乘 n ! ! n!! n!! 表示不超过 n n n 且与 n n n 有相同奇偶性的所有正整数乘积 求对于给定 n n n &#xff0c; ∏ i 1 n i ! ! \prod\limits_{i1}^n i!! i1∏n​i!! 的后缀 0 0 0 个数 解题思路 根据双阶乘的性质&…...

使用filebeat收集并解析springboot日志

序 本文主要研究一下如何使用filebeat收集并解析springboot日志 安装 在官网的下载页面filebeat/downloads提供了一些特定平台的安装包&#xff0c;不过对应linux最为省事的安装方式就是直接下载x86_64压缩包&#xff0c;然后解压即可 wget https://artifacts.elastic.co/d…...

P1993 小 K 的农场

小 K 的农场 题目描述 小 K 在 MC 里面建立很多很多的农场&#xff0c;总共 n n n 个&#xff0c;以至于他自己都忘记了每个农场中种植作物的具体数量了&#xff0c;他只记得一些含糊的信息&#xff08;共 m m m 个&#xff09;&#xff0c;以下列三种形式描述&#xff1a;…...

Spring boot 集成 Skywalking 配置 || Skywalking 打不开【已解决】

一、Skywalking官网 Apache SkyWalking 1.下载Skywalking APM &#xff08;如果下载最新的&#xff0c;双击打开闪退&#xff0c;选老点的版本&#xff09; 2. 下载 Skywalking Agents 如果下载太慢&#xff0c;建议复制下载链接&#xff0c;然后用下载器下载&#xff0c;比…...

手把手教你使用 ftrace 对 Linux 系统进行 debug

1、简介 strace:用来跟踪 Linux 进程执行时的系统调用和接收所接收的信号,可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。 ftrace:是一个 Linux 内核函数跟踪器,function tracer,旨在帮助开发人员和系统设计者可以找到内核内部发生的事情,从 L…...

【练】要求定义一个全局变量 char buf[] = “1234567“,创建两个线程,不考虑退出条件,打印buf

要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件&#xff0c;另&#xff1a; A线程循环打印buf字符串&#xff0c;B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321. 不…...

iOS Viper架构(中文版)【看懂这篇就够了】

完整源码地址 一、iOS_Viper iOS的Viper架构&#xff0c;作为一个从业多年的iOS开发者&#xff0c;我个人认为应该要会一点viper 二、前言 viper的设计模式在iOS开发中不流行&#xff0c;甚至是Swift中&#xff0c;也没有用&#xff0c;我认为比较可惜。作为iOSer,当你掌握…...

深入理解缓存 TLB 原理

今天分享一篇TLB的好文章&#xff0c;希望大家夯实基本功&#xff0c;让我们一起深入理解计算机系统。 TLB 是 translation lookaside buffer 的简称。首先&#xff0c;我们知道 MMU 的作用是把虚拟地址转换成物理地址。 MMU工作原理 虚拟地址和物理地址的映射关系存储在页表…...

获取k8s scale资源对象的命令

kubectl get --raw /apis/<apiGroup>/<apiVersion>/namespaces/<namespaceName>/<resourceKind>/<resourceName>/scale 说明&#xff1a;scale资源对象用来水平扩展k8s资源对象的副本数&#xff0c;它是作为一种k8s资源对象的子资源存在&#xf…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...