topfans/frontend/utils/screen-cache.js
2026-04-07 23:08:49 +08:00

178 lines
3.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 屏幕尺寸缓存模块
* 缓存屏幕宽度和高度避免重复调用系统API
*/
class ScreenCache {
constructor() {
this.cache = {
windowWidth: 0,
windowHeight: 0,
screenWidth: 0,
screenHeight: 0,
statusBarHeight: 0,
pixelRatio: 1,
timestamp: 0
}
this.initialized = false
}
/**
* 初始化屏幕尺寸缓存
*/
init() {
if (this.initialized) {
return this.cache
}
try {
const systemInfo = uni.getSystemInfoSync()
this.cache = {
windowWidth: systemInfo.windowWidth || 375,
windowHeight: systemInfo.windowHeight || 667,
screenWidth: systemInfo.screenWidth || 375,
screenHeight: systemInfo.screenHeight || 667,
statusBarHeight: systemInfo.statusBarHeight || 0,
pixelRatio: systemInfo.pixelRatio || 1,
timestamp: Date.now()
}
this.initialized = true
console.log('[屏幕缓存] 初始化完成:', this.cache)
} catch (error) {
console.error('[屏幕缓存] 初始化失败:', error)
// 使用默认值
this.cache = {
windowWidth: 375,
windowHeight: 667,
screenWidth: 375,
screenHeight: 667,
statusBarHeight: 0,
pixelRatio: 1,
timestamp: Date.now()
}
}
return this.cache
}
/**
* 获取窗口宽度
* @returns {number} 窗口宽度px
*/
getWindowWidth() {
if (!this.initialized) {
this.init()
}
return this.cache.windowWidth
}
/**
* 获取窗口高度
* @returns {number} 窗口高度px
*/
getWindowHeight() {
if (!this.initialized) {
this.init()
}
return this.cache.windowHeight
}
/**
* 获取屏幕宽度
* @returns {number} 屏幕宽度px
*/
getScreenWidth() {
if (!this.initialized) {
this.init()
}
return this.cache.screenWidth
}
/**
* 获取屏幕高度
* @returns {number} 屏幕高度px
*/
getScreenHeight() {
if (!this.initialized) {
this.init()
}
return this.cache.screenHeight
}
/**
* 获取状态栏高度
* @returns {number} 状态栏高度px
*/
getStatusBarHeight() {
if (!this.initialized) {
this.init()
}
return this.cache.statusBarHeight
}
/**
* 获取像素比
* @returns {number} 像素比
*/
getPixelRatio() {
if (!this.initialized) {
this.init()
}
return this.cache.pixelRatio
}
/**
* 获取所有缓存数据
* @returns {Object} 缓存数据对象
*/
getAll() {
if (!this.initialized) {
this.init()
}
return { ...this.cache }
}
/**
* 刷新缓存(屏幕方向改变时调用)
*/
refresh() {
this.initialized = false
return this.init()
}
/**
* 清除缓存
*/
clear() {
this.cache = {
windowWidth: 0,
windowHeight: 0,
screenWidth: 0,
screenHeight: 0,
statusBarHeight: 0,
pixelRatio: 1,
timestamp: 0
}
this.initialized = false
console.log('[屏幕缓存] 已清除')
}
}
// 创建单例实例
const screenCache = new ScreenCache()
// 导出单例实例和便捷方法
export default screenCache
export const getWindowWidth = () => screenCache.getWindowWidth()
export const getWindowHeight = () => screenCache.getWindowHeight()
export const getScreenWidth = () => screenCache.getScreenWidth()
export const getScreenHeight = () => screenCache.getScreenHeight()
export const getStatusBarHeight = () => screenCache.getStatusBarHeight()
export const getPixelRatio = () => screenCache.getPixelRatio()
export const refreshScreenCache = () => screenCache.refresh()
export const clearScreenCache = () => screenCache.clear()