Android13系统导航栏添加音量加减键按钮功能

不知道为什么拿到芯片原厂发布给我们的Android13系统源码编译后,导航栏没有音量加减键,客户有反馈这个问题,所以特意加了一下,修改记录如下:frameworks/base目录下

commit 9cb2244d61a237cab03c540bfcca6e4fac2bea2c
Author: incar <chs@incartech.cn>
Date:   Fri Jun 21 19:05:47 2024 +0800导航栏添加音量加减键Change-Id: Ia1811c7a94aa2f9e175b7725f96370925c5055ebdiff --git a/packages/SystemUI/res/drawable/ic_sysbar_volume_add_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_volume_add_button.xml
new file mode 100755
index 000000000000..76a145eff0cb
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_volume_add_button.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/singleToneColor"
+        android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_volume_sub_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_volume_sub_button.xml
new file mode 100755
index 000000000000..69d86071ce10
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_volume_sub_button.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="28dp"
+        android:height="28dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="?attr/singleToneColor"
+        android:pathData="M18.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM5,9v6h4l5,5V4L9,9H5z"/>
+</vector>
diff --git a/packages/SystemUI/res/layout/volume_add.xml b/packages/SystemUI/res/layout/volume_add.xml
new file mode 100755
index 000000000000..882c855a3a03
--- /dev/null
+++ b/packages/SystemUI/res/layout/volume_add.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.systemui.navigationbar.buttons.KeyButtonView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:systemui="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/volume_add"
+    android:layout_width="@dimen/navigation_key_width"
+    android:layout_height="match_parent"
+    android:layout_weight="0"
+    systemui:keyCode="24"
+    android:scaleType="center"
+    android:paddingStart="@dimen/navigation_key_padding"
+    android:paddingEnd="@dimen/navigation_key_padding"
+    />
+
diff --git a/packages/SystemUI/res/layout/volume_sub.xml b/packages/SystemUI/res/layout/volume_sub.xml
new file mode 100755
index 000000000000..4b687bd52079
--- /dev/null
+++ b/packages/SystemUI/res/layout/volume_sub.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.systemui.navigationbar.buttons.KeyButtonView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:systemui="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/volume_sub"
+    android:layout_width="@dimen/navigation_key_width"
+    android:layout_height="match_parent"
+    android:layout_weight="0"
+    systemui:keyCode="25"
+    android:scaleType="center"
+    android:paddingStart="@dimen/navigation_key_padding"
+    android:paddingEnd="@dimen/navigation_key_padding"
+    />
+
diff --git a/packages/SystemUI/res/values-sw400dp/config.xml b/packages/SystemUI/res/values-sw400dp/config.xml
new file mode 100755
index 000000000000..5c37bfb34f68
--- /dev/null
+++ b/packages/SystemUI/res/values-sw400dp/config.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+     for different hardware and product builds. -->
+<resources>
+
+    <!-- Nav bar button default ordering/layout -->
+    <string name="config_navBarLayout" translatable="false">left;volume_sub,back,home,recent,volume_add;right</string>
+
+</resources>
diff --git a/packages/SystemUI/res/values-sw400dp/dimens.xml b/packages/SystemUI/res/values-sw400dp/dimens.xml
old mode 100644
new mode 100755
index f19335bc6285..340697a37fcb
--- a/packages/SystemUI/res/values-sw400dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw400dp/dimens.xml
@@ -17,7 +17,8 @@<resources><!-- The width of the view containing navigation buttons -->
-    <dimen name="navigation_key_width">80dip</dimen>
+    <dimen name="navigation_key_width">50dp</dimen>
+    <dimen name="navigation_key_padding">30dp</dimen><!-- The padding on the side of the navigation bar. Must be greater than or equal tonavigation_extra_key_width -->
diff --git a/packages/SystemUI/res/values-sw410dp/dimens.xml b/packages/SystemUI/res/values-sw410dp/dimens.xml
old mode 100644
new mode 100755
index 7da47e5089be..62285f56c45f
--- a/packages/SystemUI/res/values-sw410dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw410dp/dimens.xml
@@ -26,5 +26,8 @@<dimen name="global_actions_grid_item_side_margin">12dp</dimen><dimen name="global_actions_grid_item_height">72dp</dimen>
+	
+	<dimen name="navigation_key_width">55dp</dimen>
+    <dimen name="navigation_key_padding">33dp</dimen></resources>
diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
old mode 100644
new mode 100755
index b24ce122208f..12973fe351a1
--- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
@@ -77,4 +77,7 @@<dimen name="lockscreen_shade_keyguard_transition_vertical_offset">83dp</dimen><dimen name="notification_panel_margin_horizontal">24dp</dimen>
+	
+	<dimen name="navigation_key_width">120dp</dimen>
+    <dimen name="navigation_key_padding">50dp</dimen></resources>
diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml
old mode 100644
new mode 100755
index 80628f903e76..9ea9eedb3cc5
--- a/packages/SystemUI/res/values-sw600dp/config.xml
+++ b/packages/SystemUI/res/values-sw600dp/config.xml
@@ -27,7 +27,7 @@<bool name="config_quickSettingsMediaLandscapeCollapsed">false</bool><!-- Nav bar button default ordering/layout -->
-    <string name="config_navBarLayout" translatable="false">left;back,home,recent;right</string>
+    <string name="config_navBarLayout" translatable="false">left;volume_sub,back,home,recent,volume_add;right</string><!-- orientation of the dead zone when touches have recently occurred elsewhere on screen --><integer name="navigation_bar_deadzone_orientation">0</integer>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index df3c8bedf1bb..ccc2b8c6604f 100755
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -301,7 +301,7 @@</string-array><!-- Nav bar button default ordering/layout -->
-    <string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string>
+    <string name="config_navBarLayout" translatable="false">left[.5W];volume_sub,back,home,recent,volume_add;right[.5W]</string><string name="config_navBarLayoutQuickstep" translatable="false">back[1.7WC];home;contextual[1.7WC]</string><string name="config_navBarLayoutHandle" translatable="false">back[70AC];home_handle;ime_switcher[70AC]</string>diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 1ef2b3c98859..bf152b112e86 100755
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -1187,6 +1187,21 @@ public class NavigationBar extends ViewController<NavigationBarView> implementsaccessibilityButton.setOnClickListener(this::onAccessibilityClick);accessibilityButton.setOnLongClickListener(this::onAccessibilityLongClick);updateAccessibilityStateFlags();
+        ButtonDispatcher volumeAddButton=mView.getVolumeAddButton();
+        ButtonDispatcher volumeSubButton=mView.getVolumeSubButton();
+        //boolean isShowVolumeButton = "true".equals(SystemProperties.get("ro.rk.systembar.voiceicon","true"));
+        boolean isShowVolumeButton = true;
+        if(isShowVolumeButton){
+            volumeAddButton.setVisibility(View.VISIBLE);
+            volumeSubButton.setVisibility(View.VISIBLE);
+        }else{
+            volumeAddButton.setVisibility(View.GONE);
+            volumeSubButton.setVisibility(View.GONE);
+        }
+        if (mContext.getResources().getConfiguration().smallestScreenWidthDp < 400) {
+            volumeAddButton.setVisibility(View.GONE);
+            volumeSubButton.setVisibility(View.GONE);
+        }ButtonDispatcher imeSwitcherButton = mView.getImeSwitchButton();imeSwitcherButton.setOnClickListener(this::onImeSwitcherClick);
@@ -1699,6 +1714,10 @@ public class NavigationBar extends ViewController<NavigationBarView> implementsupdateButtonLocation(region, touchRegionCache, mView.getAccessibilityButton(), inScreenSpace,useNearestRegion);
+        updateButtonLocation(region, touchRegionCache, mView.getVolumeAddButton(), inScreenSpace,
+                useNearestRegion);
+        updateButtonLocation(region, touchRegionCache, mView.getVolumeSubButton(), inScreenSpace,
+                useNearestRegion);if (includeFloatingButtons && mView.getFloatingRotationButton().isVisible()) {// Note: this button is floating so the nearest region doesn't applyupdateButtonLocation(
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
old mode 100644
new mode 100755
index 59bb2278edfe..70fb8a920ca0
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
@@ -68,6 +68,8 @@ public class NavigationBarInflaterView extends FrameLayoutpublic static final String RIGHT = "right";public static final String CONTEXTUAL = "contextual";public static final String IME_SWITCHER = "ime_switcher";
+    public static final String VOLUME_ADD = "volume_add";
+    public static final String VOLUME_SUB = "volume_sub";public static final String GRAVITY_SEPARATOR = ";";public static final String BUTTON_SEPARATOR = ",";
@@ -99,11 +101,13 @@ public class NavigationBarInflaterView extends FrameLayoutprivate boolean mIsVertical;private boolean mAlternativeOrder;+    private int mDensity;private OverviewProxyService mOverviewProxyService;private int mNavBarMode = NAV_BAR_MODE_3BUTTON;public NavigationBarInflaterView(Context context, AttributeSet attrs) {super(context, attrs);
+        mDensity = context.getResources().getConfiguration().densityDpi;createInflaters();mOverviewProxyService = Dependency.get(OverviewProxyService.class);mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
@@ -118,6 +122,16 @@ public class NavigationBarInflaterView extends FrameLayoutmLandscapeInflater = LayoutInflater.from(mContext.createConfigurationContext(landscape));}+    @Override
+    protected void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        if(mDensity != newConfig.densityDpi || mDensity < 600){
+            mDensity = newConfig.densityDpi;
+            clearViews();
+            inflateLayout(mCurrentLayout);
+        }
+    }
+@Overrideprotected void onFinishInflate() {super.onFinishInflate();
@@ -387,6 +401,10 @@ public class NavigationBarInflaterView extends FrameLayoutv = inflater.inflate(R.layout.home_handle, parent, false);} else if (IME_SWITCHER.equals(button)) {v = inflater.inflate(R.layout.ime_switcher, parent, false);
+        } else if (VOLUME_ADD.equals(button)) {
+            v = inflater.inflate(R.layout.volume_add, parent, false);
+        } else if (VOLUME_SUB.equals(button)) {
+            v = inflater.inflate(R.layout.volume_sub, parent, false);} else if (button.startsWith(KEY)) {String uri = extractImage(button);int code = extractKeycode(button);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
old mode 100644
new mode 100755
index 97024881ca62..8c5c589fdc22
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -45,6 +45,7 @@ import android.util.Log;import android.util.SparseArray;import android.view.ContextThemeWrapper;import android.view.Display;
+import android.view.Display.Mode;import android.view.MotionEvent;import android.view.Surface;import android.view.View;
@@ -120,6 +121,8 @@ public class NavigationBarView extends FrameLayout {private KeyButtonDrawable mHomeDefaultIcon;private KeyButtonDrawable mRecentIcon;private KeyButtonDrawable mDockedIcon;
+    private KeyButtonDrawable mVolumeAddIcon;
+    private KeyButtonDrawable mVolumeSubIcon;private Context mLightContext;private int mLightIconColor;private int mDarkIconColor;
@@ -159,6 +162,7 @@ public class NavigationBarView extends FrameLayout {* fully locked mode we only show that unlocking is blocked.*/private ScreenPinningNotify mScreenPinningNotify;
+    private boolean mIsRot0Landscape = true;/*** {@code true} if the IME can render the back button and the IME switcher button.
@@ -311,6 +315,10 @@ public class NavigationBarView extends FrameLayout {mTmpLastConfiguration = new Configuration();mConfiguration.updateFrom(context.getResources().getConfiguration());+        Display display = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+        Mode displayMode = display.getMode();
+        mIsRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight();
+        Log.v(TAG, "PW=" + displayMode.getPhysicalWidth() + ", PH=" + displayMode.getPhysicalHeight());mScreenPinningNotify = new ScreenPinningNotify(mContext);mButtonDispatchers.put(R.id.back, new ButtonDispatcher(R.id.back));
@@ -320,6 +328,8 @@ public class NavigationBarView extends FrameLayout {mButtonDispatchers.put(R.id.ime_switcher, imeSwitcherButton);mButtonDispatchers.put(R.id.accessibility_button, accessibilityButton);mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
+        mButtonDispatchers.put(R.id.volume_add, new ButtonDispatcher(R.id.volume_add));
+        mButtonDispatchers.put(R.id.volume_sub, new ButtonDispatcher(R.id.volume_sub));mDeadZone = new DeadZone(this);}@@ -420,6 +430,13 @@ public class NavigationBarView extends FrameLayout {return mButtonDispatchers.get(R.id.accessibility_button);}+    public ButtonDispatcher getVolumeAddButton() {
+        return mButtonDispatchers.get(R.id.volume_add);
+    }
+
+    public ButtonDispatcher getVolumeSubButton() {
+        return mButtonDispatchers.get(R.id.volume_sub);
+    }public RotationContextButton getRotateSuggestionButton() {return (RotationContextButton) mButtonDispatchers.get(R.id.rotate_suggestion);}
@@ -464,6 +481,8 @@ public class NavigationBarView extends FrameLayout {if (orientationChange || densityChange || dirChange) {mBackIcon = getBackDrawable();}
+        mVolumeAddIcon = getDrawable(R.drawable.ic_sysbar_volume_add_button);
+        mVolumeSubIcon = getDrawable(R.drawable.ic_sysbar_volume_sub_button);}/**
@@ -607,6 +626,8 @@ public class NavigationBarView extends FrameLayout {}getHomeButton().setImageDrawable(homeIcon);getBackButton().setImageDrawable(backIcon);
+        getVolumeAddButton().setImageDrawable(mVolumeAddIcon);
+        getVolumeSubButton().setImageDrawable(mVolumeSubIcon);updateRecentsIcon();

涉及到修改的文件如下:注意别遗漏了

 packages/SystemUI/res/drawable/ic_sysbar_volume_add_button.xml    
 packages/SystemUI/res/drawable/ic_sysbar_volume_sub_button.xml     
 packages/SystemUI/res/layout/volume_add.xml                              
 packages/SystemUI/res/layout/volume_sub.xml      
 packages/SystemUI/res/values-sw400dp/config.xml        
 packages/SystemUI/res/values-sw400dp/dimens.xml   
 packages/SystemUI/res/values-sw410dp/dimens.xml         
 packages/SystemUI/res/values-sw600dp-land/dimens.xml               
 packages/SystemUI/res/values-sw600dp/config.xml                 
 packages/SystemUI/res/values/config.xml                                        
 packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java     
 packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java 
 packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux OpenGrok搭建

文章目录 一、目的二、环境三、相关概念3.1 OpenGrok3.2 CTags3.3 Tomcat 四、OpenGrok搭建4.1 安装jdk4.2 安装ctags依赖4.3 安装universal-ctags4.3.1 下载universal-ctags4.3.2 编译&&安装universal-ctags 4.4 安装Tomcat4.4.1 下载&&解压Tomcat4.4.2 启动T…

继续捡钱,每天几百块!

每日操作计划&#xff1a; 标普信息科技(161128)&#xff0c;溢价8.5%&#xff0c;限购100&#xff0c;一拖七&#xff0c;单户每天700*8.5%59元 印度基金LOF(164824)&#xff0c;溢价2.6%&#xff0c;限购100&#xff0c;一拖七&#xff0c;单户每天700*2.6%18元 美元债LOF(…

【leetcode系列】46.全排列

题目&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2&#xff1a; 输入&am…

算法力扣刷题记录 二十【18题. 四数之和】

前言 哈希篇&#xff0c;继续。 记录 二十【18题. 四数之和】 一、题目阅读 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一…

为什么要本地化您的多媒体内容?

当我们访问网站、应用程序和社交媒体时&#xff0c;体验不再局限于陈旧的文本和静态图像。现代处理能力和连接速度提高了快速加载视频、音频和动画的可能性。 这一切都提供了更具沉浸感和互动性的用户体验。多媒体是数字营销中最有效的内容之一&#xff0c;因为它对用户更具吸…

vue-cli 项目打包优化-基础篇

1、项目打包完运行空白 引用资源路径问题&#xff0c;打包完的【index.html】文件引用其他文件的引用地址不对 参考配置&#xff1a;https://cli.vuejs.org/zh/config 修改vue.config.js &#xff0c;根据与 后端 或 运维 沟通修改 module.export {// 默认 publicPath: //…

使用API有效率地管理Dynadot域名,为文件夹中的域名设置域名转发

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

全彩屏负氧离子监测站

TH-FZ5在追求绿色生态、健康出行的今天&#xff0c;景区不仅仅是人们休闲游玩的好去处&#xff0c;更是人们体验大自然、感受清新空气的重要场所。为了进一步提升游客的游览体验&#xff0c;许多景区纷纷引入了全彩屏负氧离子监测站&#xff0c;这一创新举措不仅为景区增添了科…

【怀庄之醉白酒】怀庄之醉酱香白酒哪款好?

【怀庄之醉酱香白酒】在怀庄之醉酱香白酒的丰富系列中&#xff0c;怀庄之醉尊品、怀庄之醉三星和怀庄之醉匠心之作是三款受到广泛欢迎的产品。 每一款酒都具备其独特的风味和适合的饮用场合。以下是对这三款酒特性的分析&#xff1a; 怀庄之醉 尊品&#xff1a;怀庄之醉 尊品…

云通SIPX,您的码号资源智能调度专家!

在数字化转型的浪潮中&#xff0c;号码资源作为企业与客户沟通的重要桥梁&#xff0c;其管理效率直接关系到企业运营的成败。随着运营商对号码资源管理的规范化和精细化&#xff0c;企业对高效、智能的号码资源管理需求日益增长&#xff0c;以实现对外呼叫的降本增效。 一、什么…

学生成绩管理系统带8000字文档学生选课管理系统java项目javaweb项目ssm项目jsp项目java课程设计java毕业设计

文章目录 学生选课成绩管理系统一、项目演示二、项目介绍三、8500字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带8500字文档&#xff08;9.9&#xffe5;带走&#xff09; 学生选课成绩管理系统 一、项目演示 选课成绩管理系统 二、项目介绍 语言: Java …

php数据结构之链表

本文由 ChatMoney团队出品 链表的基本概念 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点除了存储数据外&#xff0c;还包含指向下一个节点的指针。与数组相比&#xff0c;链表在插入和删除操作上具有更高…

直播带货大模型,开启自动卖货的时代

Streamer-Sales是一个为直播带货主播量身定制的智能工具。 它能够智能分析商品特性&#xff0c;自动创作出引人入胜的解说词&#xff0c;从而有效增强商品的吸引力和提升销售业绩。它还具备多种交互功能&#xff0c;比如将主播的语音实时转换为文字&#xff0c;便于与观众进行…

移动端 UI 风格,书写华丽篇章

移动端 UI 风格&#xff0c;书写华丽篇章

原创作品—医疗行业软件界面UI、交互设计

在医疗行业大屏UI设计中&#xff0c;首要的是以用户为中心&#xff0c;深入理解医生、护士、管理层等用户群体的具体需求和工作流程。大屏设计应直观展示关键医疗数据、患者信息、设备状态等&#xff0c;确保用户能够迅速、准确地获取所需信息。同时&#xff0c;功能布局应合理…

12寸和8寸封装线的差异点

12英寸&#xff08;300mm&#xff09;晶圆封装线与8英寸&#xff08;200mm&#xff09;晶圆封装线在多个方面存在显著区别&#xff0c;这些区别影响了它们的生产效率、成本结构和适用技术。以下是一些主要差异&#xff1a; 1. **晶圆面积**&#xff1a; - 12英寸晶圆拥有更…

​​植物大战僵尸杂交版直装版v2.1 安卓版:全新策略塔防体验

《植物大战僵尸杂交版直装版》v2.1是由B站UP主“潜艇伟伟迷”精心制作的同人游戏&#xff0c;为策略塔防手游带来了全新的活力。游戏中引入了众多创新的杂交植物&#xff0c;例如结合了向日葵的阳光生成能力和豌豆射手的攻击特性的向日葵豌豆射手&#xff0c;以及拥有寒冰豌豆射…

docker打包 arm32v7/debian 问题总结

1.架构不同 我的宿主是x86 ,但是打包的是arm架构 安装qemu sudo apt-get install binfmt-support qemu qemu-user-static 然后使用buildx打包 docker buildx build --no-cache --platform linux/arm/v7 -t tdc_post:1.0.1 . --load 保存tar docker save -o tdc_post.tar tdc_p…

金融科技如何运用技术手段实现细颗粒度服务

随着金融科技的快速发展&#xff0c;金融机构正在通过采用各种技术手段来提供更加细颗粒度的服务&#xff0c;以满足客户日益增长的个性化需求。这些技术手段不仅提高了金融服务的效率和安全性&#xff0c;还显著提升了用户体验和满意度。 一、大数据分析与人工智能&#xff08…

中国旺旺:廉颇老矣or老而弥坚?

从80后的童年吃到了20后的童年&#xff0c;什么舌尖上的产品能旺这么久&#xff1f; 相信大家都能说出他的名字——中国旺旺。 要问旺旺的第一单品是啥&#xff1f;毫无疑问是旺仔牛奶。 这也体现在财报上&#xff0c;2022财年&#xff0c;旺旺乳品、饮料品类收入双位数下滑&…