98 lines
2.7 KiB
JavaScript
Raw Normal View History

2025-08-08 09:22:47 +08:00
/**
* 系统信息工具类
* 用于获取状态栏和微信胶囊按钮信息
*/
class SystemInfoUtil {
constructor() {
// 缓存系统信息,避免重复获取
this.systemInfo = null;
// 缓存微信胶囊按钮信息
this.menuButtonInfo = null;
}
/**
* 初始化系统信息
* @returns {Promise} 包含系统信息的Promise对象
*/
init() {
return new Promise((resolve, reject) => {
// 如果已经获取过信息,直接返回缓存
if (this.systemInfo && this.menuButtonInfo) {
resolve({
systemInfo: this.systemInfo,
menuButtonInfo: this.menuButtonInfo
});
return;
}
// 获取系统信息
uni.getSystemInfo({
success: (res) => {
this.systemInfo = res;
// 获取微信胶囊按钮信息
this.menuButtonInfo = uni.getMenuButtonBoundingClientRect();
resolve({
systemInfo: this.systemInfo,
menuButtonInfo: this.menuButtonInfo
});
},
fail: (err) => {
console.error('获取系统信息失败', err);
reject(err);
}
});
});
}
/**
* 获取状态栏高度
* @returns {number} 状态栏高度单位px
*/
getStatusBarHeight() {
return this.systemInfo?.statusBarHeight || 0;
}
/**
* 获取微信胶囊按钮信息
* @returns {Object} 胶囊按钮信息对象
*/
getMenuButtonInfo() {
return this.menuButtonInfo || {};
}
/**
* 计算自定义导航栏高度
* @returns {number} 自定义导航栏高度单位px
*/
getCustomNavBarHeight() {
if (!this.systemInfo || !this.menuButtonInfo) {
console.warn('请先调用init()方法初始化系统信息');
return 0;
}
// 胶囊按钮高度 + (胶囊顶部距离 - 状态栏高度) * 2
return this.menuButtonInfo.height + (this.menuButtonInfo.top - this.systemInfo.statusBarHeight) * 2;
}
/**
* 获取屏幕宽度
* @returns {number} 屏幕宽度单位px
*/
getScreenWidth() {
return this.systemInfo?.windowWidth || 0;
}
/**
* 获取屏幕高度
* @returns {number} 屏幕高度单位px
*/
getScreenHeight() {
return this.systemInfo?.windowHeight || 0;
}
}
// 导出单例实例,确保全局使用同一个对象
export default new SystemInfoUtil();