解决冲突
10
pages.json
|
|
@ -15,10 +15,18 @@
|
|||
"navigationStyle": "custom"
|
||||
}
|
||||
|
||||
},
|
||||
// 录屏
|
||||
{
|
||||
"path": "pages/recording/recorder",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
|
||||
},
|
||||
// 动画首页
|
||||
{
|
||||
"path": "pages/login/animationpage",
|
||||
"path": "pages/login/newanimationpage",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -375,7 +375,7 @@
|
|||
});
|
||||
connectWs(); // 主动连接 WebSocket
|
||||
}
|
||||
jumpTo(`/pages/login/animationpage`)
|
||||
jumpTo(`/pages/login/newanimationpage`)
|
||||
}
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,365 @@
|
|||
// utils/record.js
|
||||
|
||||
// 录屏工具类
|
||||
class ScreenRecorder {
|
||||
constructor() {
|
||||
this.recordModule = null
|
||||
this.eventModule = null
|
||||
this.isRecording = false
|
||||
this.recordTime = 0
|
||||
this.recordTimer = null
|
||||
this.eventListeners = new Map()
|
||||
|
||||
this.init()
|
||||
}
|
||||
|
||||
// 初始化
|
||||
init() {
|
||||
try {
|
||||
// 获取原生模块
|
||||
this.recordModule = uni.requireNativePlugin('Record-Module')
|
||||
this.eventModule = uni.requireNativePlugin('RecordEvent-Module')
|
||||
|
||||
console.log('录屏模块初始化成功')
|
||||
} catch (error) {
|
||||
console.error('录屏模块初始化失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// 开始录屏
|
||||
start(options = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.recordModule) {
|
||||
reject(new Error('录屏模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
if (this.isRecording) {
|
||||
reject(new Error('已经在录制中'))
|
||||
return
|
||||
}
|
||||
|
||||
const defaultOptions = {
|
||||
width: 720, // 宽度
|
||||
height: 1280, // 高度
|
||||
bitRate: 4000000, // 比特率 4Mbps
|
||||
fileName: null, // 自定义文件名
|
||||
recordAudio: true // 是否录制音频
|
||||
}
|
||||
|
||||
const recordOptions = { ...defaultOptions, ...options }
|
||||
|
||||
console.log('开始录屏,参数:', recordOptions)
|
||||
|
||||
this.recordModule.startRecording(recordOptions, (result) => {
|
||||
console.log('开始录屏结果:', result)
|
||||
|
||||
if (result.code === 0 && result.success) {
|
||||
this.isRecording = true
|
||||
this.startTimer()
|
||||
|
||||
// 触发开始事件
|
||||
this.emit('start', { options: recordOptions })
|
||||
|
||||
resolve({
|
||||
success: true,
|
||||
message: '开始录屏成功',
|
||||
data: result
|
||||
})
|
||||
} else {
|
||||
reject(new Error(result.message || '开始录屏失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 停止录屏
|
||||
stop() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.recordModule) {
|
||||
reject(new Error('录屏模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
if (!this.isRecording) {
|
||||
resolve({
|
||||
success: true,
|
||||
message: '当前没有在录制'
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
console.log('停止录屏')
|
||||
|
||||
this.recordModule.stopRecording((result) => {
|
||||
console.log('停止录屏结果:', result)
|
||||
|
||||
this.isRecording = false
|
||||
this.stopTimer()
|
||||
|
||||
if (result.code === 0 && result.success) {
|
||||
// 触发停止事件
|
||||
this.emit('stop', {})
|
||||
|
||||
resolve({
|
||||
success: true,
|
||||
message: '停止录屏成功',
|
||||
data: result
|
||||
})
|
||||
} else {
|
||||
reject(new Error(result.message || '停止录屏失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 获取录屏状态
|
||||
getStatus() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.recordModule) {
|
||||
reject(new Error('录屏模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
this.recordModule.getRecordingStatus((result) => {
|
||||
this.isRecording = result.isRecording
|
||||
|
||||
resolve({
|
||||
isRecording: result.isRecording,
|
||||
duration: result.duration,
|
||||
filePath: result.filePath,
|
||||
...result
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 获取录屏文件列表
|
||||
getFileList() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.recordModule) {
|
||||
reject(new Error('录屏模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
this.recordModule.getRecordFiles((result) => {
|
||||
if (result.code === 0) {
|
||||
resolve({
|
||||
success: true,
|
||||
files: result.files,
|
||||
count: result.count
|
||||
})
|
||||
} else {
|
||||
reject(new Error(result.message || '获取文件列表失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 删除录屏文件
|
||||
deleteFile(filePath) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.recordModule) {
|
||||
reject(new Error('录屏模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
this.recordModule.deleteRecordFile(filePath, (result) => {
|
||||
if (result.code === 0 && result.success) {
|
||||
resolve({
|
||||
success: true,
|
||||
message: '删除成功'
|
||||
})
|
||||
} else {
|
||||
reject(new Error(result.message || '删除失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 检查录屏权限
|
||||
checkPermission() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.recordModule) {
|
||||
reject(new Error('录屏模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
this.recordModule.checkPermission((result) => {
|
||||
resolve({
|
||||
hasPermission: result.hasPermission,
|
||||
message: result.message,
|
||||
...result
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 开始事件监听
|
||||
startListen() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.eventModule) {
|
||||
reject(new Error('事件模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
this.eventModule.startListen((result) => {
|
||||
if (result.code === 0 && result.success) {
|
||||
// 监听全局事件
|
||||
uni.$on('recordEvent', this.handleRecordEvent.bind(this))
|
||||
|
||||
resolve({
|
||||
success: true,
|
||||
message: '开始监听成功'
|
||||
})
|
||||
} else {
|
||||
reject(new Error(result.message || '开始监听失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 停止事件监听
|
||||
stopListen() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!this.eventModule) {
|
||||
reject(new Error('事件模块未初始化'))
|
||||
return
|
||||
}
|
||||
|
||||
this.eventModule.stopListen((result) => {
|
||||
if (result.code === 0 && result.success) {
|
||||
// 移除全局事件监听
|
||||
uni.$off('recordEvent', this.handleRecordEvent.bind(this))
|
||||
|
||||
resolve({
|
||||
success: true,
|
||||
message: '停止监听成功'
|
||||
})
|
||||
} else {
|
||||
reject(new Error(result.message || '停止监听失败'))
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 处理录屏事件
|
||||
handleRecordEvent(event) {
|
||||
console.log('收到录屏事件:', event)
|
||||
|
||||
const { type, data } = event
|
||||
|
||||
switch (type) {
|
||||
case 'onRecordEvent':
|
||||
this.handleNativeEvent(data)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 处理原生事件
|
||||
handleNativeEvent(data) {
|
||||
const { event, filePath } = data
|
||||
|
||||
switch (event) {
|
||||
case 'start':
|
||||
console.log('录屏开始,文件路径:', filePath)
|
||||
this.emit('started', { filePath })
|
||||
break
|
||||
|
||||
case 'stop':
|
||||
console.log('录屏停止,文件路径:', filePath)
|
||||
this.emit('stopped', { filePath })
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 开始计时器
|
||||
startTimer() {
|
||||
this.recordTime = 0
|
||||
this.recordTimer = setInterval(() => {
|
||||
this.recordTime++
|
||||
|
||||
// 触发计时事件
|
||||
this.emit('timeupdate', {
|
||||
currentTime: this.recordTime
|
||||
})
|
||||
|
||||
}, 1000)
|
||||
}
|
||||
|
||||
// 停止计时器
|
||||
stopTimer() {
|
||||
if (this.recordTimer) {
|
||||
clearInterval(this.recordTimer)
|
||||
this.recordTimer = null
|
||||
this.recordTime = 0
|
||||
}
|
||||
}
|
||||
|
||||
// 格式化时间
|
||||
formatTime(seconds) {
|
||||
const hours = Math.floor(seconds / 3600)
|
||||
const minutes = Math.floor((seconds % 3600) / 60)
|
||||
const secs = seconds % 60
|
||||
|
||||
if (hours > 0) {
|
||||
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
|
||||
} else {
|
||||
return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
|
||||
}
|
||||
}
|
||||
|
||||
// 事件监听
|
||||
on(event, callback) {
|
||||
if (!this.eventListeners.has(event)) {
|
||||
this.eventListeners.set(event, [])
|
||||
}
|
||||
this.eventListeners.get(event).push(callback)
|
||||
}
|
||||
|
||||
// 取消事件监听
|
||||
off(event, callback) {
|
||||
if (this.eventListeners.has(event)) {
|
||||
const listeners = this.eventListeners.get(event)
|
||||
const index = listeners.indexOf(callback)
|
||||
if (index > -1) {
|
||||
listeners.splice(index, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 触发事件
|
||||
emit(event, data) {
|
||||
if (this.eventListeners.has(event)) {
|
||||
this.eventListeners.get(event).forEach(callback => {
|
||||
try {
|
||||
callback(data)
|
||||
} catch (error) {
|
||||
console.error(`执行事件 ${event} 的回调失败:`, error)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 销毁
|
||||
destroy() {
|
||||
this.stop()
|
||||
this.stopListen()
|
||||
this.eventListeners.clear()
|
||||
|
||||
this.recordModule = null
|
||||
this.eventModule = null
|
||||
}
|
||||
}
|
||||
|
||||
// 创建单例
|
||||
let recorderInstance = null
|
||||
|
||||
export function getScreenRecorder() {
|
||||
if (!recorderInstance) {
|
||||
recorderInstance = new ScreenRecorder()
|
||||
}
|
||||
return recorderInstance
|
||||
}
|
||||
|
||||
export default getScreenRecorder
|
||||
|
|
@ -0,0 +1,241 @@
|
|||
<!-- SimpleRecorder.vue -->
|
||||
<template>
|
||||
<view class="simple-recorder">
|
||||
<!-- 录制按钮 -->
|
||||
<view
|
||||
class="simple-record-btn"
|
||||
:class="{ 'recording': isRecording }"
|
||||
@click="toggleRecording"
|
||||
>
|
||||
<view class="btn-icon">
|
||||
<view v-if="!isRecording" class="icon-start">●</view>
|
||||
<view v-else class="icon-stop">■</view>
|
||||
</view>
|
||||
<text class="btn-text">
|
||||
{{ isRecording ? '停止录制' : '开始录制' }}
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<!-- 录制时间 -->
|
||||
<view v-if="isRecording" class="recording-time">
|
||||
<text>{{ formatTime(recordTime) }}</text>
|
||||
</view>
|
||||
|
||||
<!-- 状态提示 -->
|
||||
<view v-if="message" class="status-message">
|
||||
<text>{{ message }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getScreenRecorder } from './recorder.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
recorder: null,
|
||||
isRecording: false,
|
||||
recordTime: 0,
|
||||
recordTimer: null,
|
||||
message: ''
|
||||
}
|
||||
},
|
||||
|
||||
onLoad() {
|
||||
this.initRecorder()
|
||||
},
|
||||
|
||||
onUnload() {
|
||||
this.cleanup()
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 初始化
|
||||
async initRecorder() {
|
||||
try {
|
||||
this.recorder = getScreenRecorder()
|
||||
await this.recorder.startListen()
|
||||
console.log('录屏器初始化成功')
|
||||
} catch (error) {
|
||||
console.error('初始化失败:', error)
|
||||
this.showMessage('录屏功能初始化失败' + error)
|
||||
}
|
||||
},
|
||||
|
||||
// 开始/停止录制
|
||||
async toggleRecording() {
|
||||
if (this.isRecording) {
|
||||
await this.stopRecord()
|
||||
} else {
|
||||
await this.startRecord()
|
||||
}
|
||||
},
|
||||
|
||||
// 开始录制
|
||||
async startRecord() {
|
||||
try {
|
||||
this.showMessage('开始录制...')
|
||||
|
||||
const options = {
|
||||
width: 1280,
|
||||
height: 720,
|
||||
bitRate: 4000000,
|
||||
recordAudio: true
|
||||
}
|
||||
|
||||
await this.recorder.start(options)
|
||||
|
||||
this.isRecording = true
|
||||
this.recordTime = 0
|
||||
this.startTimer()
|
||||
|
||||
this.showMessage('录制已开始')
|
||||
|
||||
} catch (error) {
|
||||
console.error('开始录制失败:', error)
|
||||
this.showMessage('开始录制失败: ' + error.message)
|
||||
}
|
||||
},
|
||||
|
||||
// 停止录制
|
||||
async stopRecord() {
|
||||
try {
|
||||
this.showMessage('停止录制...')
|
||||
|
||||
await this.recorder.stop()
|
||||
|
||||
this.isRecording = false
|
||||
this.stopTimer()
|
||||
|
||||
this.showMessage('录制已停止')
|
||||
|
||||
} catch (error) {
|
||||
console.error('停止录制失败:', error)
|
||||
this.showMessage('停止录制失败: ' + error.message)
|
||||
}
|
||||
},
|
||||
|
||||
// 计时器
|
||||
startTimer() {
|
||||
this.stopTimer()
|
||||
this.recordTimer = setInterval(() => {
|
||||
this.recordTime++
|
||||
}, 1000)
|
||||
},
|
||||
|
||||
stopTimer() {
|
||||
if (this.recordTimer) {
|
||||
clearInterval(this.recordTimer)
|
||||
this.recordTimer = null
|
||||
}
|
||||
},
|
||||
|
||||
// 格式化时间
|
||||
formatTime(seconds) {
|
||||
const minutes = Math.floor(seconds / 60)
|
||||
const secs = seconds % 60
|
||||
return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
|
||||
},
|
||||
|
||||
// 显示消息
|
||||
showMessage(msg) {
|
||||
this.message = msg
|
||||
setTimeout(() => {
|
||||
this.message = ''
|
||||
}, 3000)
|
||||
},
|
||||
|
||||
// 清理
|
||||
cleanup() {
|
||||
this.stopTimer()
|
||||
if (this.recorder) {
|
||||
this.recorder.destroy()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.simple-recorder {
|
||||
padding: 100rpx 30rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
min-height: 100vh;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
|
||||
.simple-record-btn {
|
||||
width: 200rpx;
|
||||
height: 200rpx;
|
||||
border-radius: 50%;
|
||||
background: #ff3b30;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 40rpx;
|
||||
box-shadow: 0 10rpx 30rpx rgba(255, 59, 48, 0.3);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.simple-record-btn.recording {
|
||||
background: #007AFF;
|
||||
box-shadow: 0 10rpx 30rpx rgba(0, 122, 255, 0.3);
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
.btn-icon {
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.icon-start {
|
||||
color: white;
|
||||
font-size: 80rpx;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.icon-stop {
|
||||
color: white;
|
||||
font-size: 60rpx;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.btn-text {
|
||||
color: white;
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.recording-time {
|
||||
font-size: 36rpx;
|
||||
color: #333;
|
||||
font-family: monospace;
|
||||
font-weight: bold;
|
||||
margin-top: 20rpx;
|
||||
padding: 20rpx 40rpx;
|
||||
background: white;
|
||||
border-radius: 50rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.status-message {
|
||||
position: fixed;
|
||||
bottom: 100rpx;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: rgba(0, 0, 0, 0.8);
|
||||
color: white;
|
||||
padding: 20rpx 40rpx;
|
||||
border-radius: 50rpx;
|
||||
font-size: 28rpx;
|
||||
z-index: 1000;
|
||||
}
|
||||
</style>
|
||||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 233 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 176 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 355 KiB |
|
|
@ -4,5 +4,8 @@ Promise.resolve("./pages/camera.js").then((res) => {
|
|||
Promise.resolve("./pages/fullcamera.js").then((res) => {
|
||||
res();
|
||||
});
|
||||
Promise.resolve("./pages/fullcamera.js").then((res) => {
|
||||
res();
|
||||
});
|
||||
Promise.resolve("./app.css.js").then(() => {
|
||||
});
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ const _sfc_main = {
|
|||
uni.$on("fullmonitor:changeinit", (number) => {
|
||||
this.$refs.monitor.initAutoPlay(number);
|
||||
uni.setStorageSync("saveinit", number);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:63", "切换了", number);
|
||||
this.suo = true;
|
||||
});
|
||||
uni.$on("fullmonitor:isshow", (bool) => this.isshow = bool);
|
||||
|
|
@ -73,7 +74,7 @@ const _sfc_main = {
|
|||
uni.$on("fullmonitor:test", this.test);
|
||||
},
|
||||
onUnload() {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:84", "fullcamera 卸载,清理事件");
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:85", "fullcamera 卸载,清理事件");
|
||||
if (this.globalEvent && this.globalEvent.removeEventListener) {
|
||||
this.globalEvent.removeEventListener("myEvent");
|
||||
}
|
||||
|
|
@ -100,30 +101,30 @@ const _sfc_main = {
|
|||
methods: {
|
||||
/* ------------------ 原有功能 ------------------ */
|
||||
handleTelEvent(event) {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:115", "Tel event detail:", event.detail);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:116", "Tel event detail:", event.detail);
|
||||
},
|
||||
killView() {
|
||||
this.$refs.monitor.killView && this.$refs.monitor.killView();
|
||||
},
|
||||
switchDisplay(mode) {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:123", "zzzzz", mode);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:124", "zzzzz", mode);
|
||||
this.$refs.monitor && this.$refs.monitor.switchDisplayModeFragment(mode);
|
||||
},
|
||||
startAlarm() {
|
||||
this.isAlarming = true;
|
||||
this.$refs.monitor.startOrStopManualAlarm(this.isAlarming, (res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:130", "startAlarm callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:131", "startAlarm callback:", res);
|
||||
});
|
||||
},
|
||||
stopAlarm() {
|
||||
this.isAlarming = false;
|
||||
this.$refs.monitor.startOrStopManualAlarm(this.isAlarming, (res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:136", "stopAlarm callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:137", "stopAlarm callback:", res);
|
||||
});
|
||||
},
|
||||
flipImage(type) {
|
||||
this.$refs.monitor.changeImageSwitch(type, (res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:142", "flipImage callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:143", "flipImage callback:", res);
|
||||
});
|
||||
},
|
||||
resumeOrPause() {
|
||||
|
|
@ -160,7 +161,7 @@ const _sfc_main = {
|
|||
}
|
||||
try {
|
||||
this.$refs.monitor.snapShot((res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:188", "snapShot callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:189", "snapShot callback:", res);
|
||||
this._handleSnapshotResultFromNative(res, payload.reqId);
|
||||
});
|
||||
uni.showToast({
|
||||
|
|
@ -169,7 +170,7 @@ const _sfc_main = {
|
|||
duration: 800
|
||||
});
|
||||
} catch (err) {
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:197", "snapShot 调用失败", err);
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:198", "snapShot 调用失败", err);
|
||||
uni.showToast({
|
||||
title: "snapShot 调用失败",
|
||||
icon: "none"
|
||||
|
|
@ -201,7 +202,7 @@ const _sfc_main = {
|
|||
}
|
||||
try {
|
||||
this.$refs.monitor.startRecord((res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:230", "startRecord callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:231", "startRecord callback:", res);
|
||||
if (payload.reqId) {
|
||||
uni.$emit(`fullmonitor:response:${payload.reqId}`, {
|
||||
ok: true,
|
||||
|
|
@ -215,7 +216,7 @@ const _sfc_main = {
|
|||
icon: "none"
|
||||
});
|
||||
} catch (err) {
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:245", "startRecord 调用失败", err);
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:246", "startRecord 调用失败", err);
|
||||
uni.showToast({
|
||||
title: "startRecord 调用失败",
|
||||
icon: "none"
|
||||
|
|
@ -250,11 +251,11 @@ const _sfc_main = {
|
|||
}
|
||||
try {
|
||||
this.$refs.monitor.stopRecord((res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:284", "stopRecord callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:285", "stopRecord callback:", res);
|
||||
this._handleRecordResultFromNative(res, payload.reqId);
|
||||
});
|
||||
} catch (err) {
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:289", "stopRecord 调用失败", err);
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:290", "stopRecord 调用失败", err);
|
||||
uni.showToast({
|
||||
title: "stopRecord 调用失败",
|
||||
icon: "none"
|
||||
|
|
@ -289,7 +290,7 @@ const _sfc_main = {
|
|||
}
|
||||
try {
|
||||
this.$refs.monitor.openTalk((res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:326", "openTalk callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:327", "openTalk callback:", res);
|
||||
if (payload.reqId) {
|
||||
uni.$emit(`fullmonitor:response:${payload.reqId}`, {
|
||||
ok: true,
|
||||
|
|
@ -303,7 +304,7 @@ const _sfc_main = {
|
|||
icon: "none"
|
||||
});
|
||||
} catch (err) {
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:341", "openTalk 调用失败", err);
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:342", "openTalk 调用失败", err);
|
||||
uni.showToast({
|
||||
title: "openTalk 调用失败",
|
||||
icon: "none"
|
||||
|
|
@ -335,7 +336,7 @@ const _sfc_main = {
|
|||
}
|
||||
try {
|
||||
this.$refs.monitor.stopTalk((res) => {
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:374", "stopTalk callback:", res);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:375", "stopTalk callback:", res);
|
||||
if (payload.reqId) {
|
||||
uni.$emit(`fullmonitor:response:${payload.reqId}`, {
|
||||
ok: true,
|
||||
|
|
@ -345,7 +346,7 @@ const _sfc_main = {
|
|||
});
|
||||
this.isTalking = false;
|
||||
} catch (err) {
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:384", "stopTalk 调用失败", err);
|
||||
formatAppLog("error", "at pages/fullcamera.nvue:385", "stopTalk 调用失败", err);
|
||||
uni.showToast({
|
||||
title: "stopTalk 调用失败",
|
||||
icon: "none"
|
||||
|
|
@ -363,19 +364,19 @@ const _sfc_main = {
|
|||
// 处理来自模板 @onSnapShot 的事件(event.detail)
|
||||
handleSnapShotEvent(event) {
|
||||
const payload = event && event.detail ? event.detail : event;
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:404", "onSnapShot event:", payload);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:405", "onSnapShot event:", payload);
|
||||
this._handleSnapshotResultFromNative(payload);
|
||||
},
|
||||
// 处理来自模板 @onRecord 的事件(event.detail)
|
||||
handleRecordEvent(event) {
|
||||
const payload = event && event.detail ? event.detail : event;
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:412", "onRecord event:", payload);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:413", "onRecord event:", payload);
|
||||
this._handleRecordResultFromNative(payload);
|
||||
},
|
||||
// 处理来自模板 @onTalkStatus 的事件
|
||||
handleTalkEvent(event) {
|
||||
const payload = event && event.detail ? event.detail : event;
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:419", "onTalkStatus event:", payload);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:420", "onTalkStatus event:", payload);
|
||||
const status = payload && payload.talkStatus;
|
||||
const tips = payload && payload.tips;
|
||||
uni.$emit("fullmonitor:talk:status", payload);
|
||||
|
|
@ -443,7 +444,7 @@ const _sfc_main = {
|
|||
let payload = res;
|
||||
if (res.detail)
|
||||
payload = res.detail;
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:496", "snapshot payload normalized:", payload);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:497", "snapshot payload normalized:", payload);
|
||||
if (reqIdFromCallback) {
|
||||
uni.$emit(`fullmonitor:response:${reqIdFromCallback}`, {
|
||||
ok: !!payload.snapShotResult,
|
||||
|
|
@ -479,7 +480,7 @@ const _sfc_main = {
|
|||
icon: "none",
|
||||
duration: 2e3
|
||||
});
|
||||
formatAppLog("warn", "at pages/fullcamera.nvue:539", "snapshot failed reason:", err, payload);
|
||||
formatAppLog("warn", "at pages/fullcamera.nvue:540", "snapshot failed reason:", err, payload);
|
||||
}
|
||||
},
|
||||
_handleRecordResultFromNative(res, reqIdFromCallback = null) {
|
||||
|
|
@ -500,7 +501,7 @@ const _sfc_main = {
|
|||
let payload = res;
|
||||
if (res.detail)
|
||||
payload = res.detail;
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:561", "record payload normalized:", payload);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:562", "record payload normalized:", payload);
|
||||
if (reqIdFromCallback) {
|
||||
uni.$emit(`fullmonitor:response:${reqIdFromCallback}`, {
|
||||
ok: !!(payload.recordUrl || payload.snapShotResult),
|
||||
|
|
@ -524,7 +525,7 @@ const _sfc_main = {
|
|||
duration: 1400
|
||||
});
|
||||
this.isRecording = false;
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:592", "录屏地址:", payload.recordUrl);
|
||||
formatAppLog("log", "at pages/fullcamera.nvue:593", "录屏地址:", payload.recordUrl);
|
||||
} else if (payload.recordFailedReason) {
|
||||
uni.showToast({
|
||||
title: "录屏失败: " + payload.recordFailedReason,
|
||||
|
|
@ -532,7 +533,7 @@ const _sfc_main = {
|
|||
duration: 2e3
|
||||
});
|
||||
this.isRecording = false;
|
||||
formatAppLog("warn", "at pages/fullcamera.nvue:600", "record failed reason:", payload.recordFailedReason);
|
||||
formatAppLog("warn", "at pages/fullcamera.nvue:601", "record failed reason:", payload.recordFailedReason);
|
||||
} else {
|
||||
if (payload.snapShotResult === true) {
|
||||
uni.showToast({
|
||||
|
|
@ -556,12 +557,12 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|||
}, [
|
||||
createElementVNode("div", {
|
||||
class: "center-column",
|
||||
style: normalizeStyle({ height: $data.isshow ? "500px" : "0px" })
|
||||
style: normalizeStyle({ height: $data.isshow ? "449px" : "0px" })
|
||||
}, [
|
||||
createVNode(_component_MonitorView, {
|
||||
ref: "monitor",
|
||||
init: "5",
|
||||
style: { "width": "800px", "height": "500px" },
|
||||
style: { "width": "800px", "height": "450px" },
|
||||
onOnTel: $options.handleTelEvent,
|
||||
onOnSnapShot: $options.handleSnapShotEvent,
|
||||
onOnRecord: $options.handleRecordEvent,
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@
|
|||
"id": "__UNI__FB2D473",
|
||||
"name": "护理单元",
|
||||
"version": {
|
||||
"name": "1.0.018",
|
||||
"code": 10018
|
||||
"name": "1.0.020",
|
||||
"code": 10020
|
||||
},
|
||||
"description": "护理单元",
|
||||
"developer": {
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
.simple-recorder{padding:3.125rem .9375rem;display:flex;flex-direction:column;align-items:center;min-height:100vh;background:#f5f5f5}.simple-record-btn{width:6.25rem;height:6.25rem;border-radius:50%;background:#ff3b30;display:flex;flex-direction:column;align-items:center;justify-content:center;margin-bottom:1.25rem;box-shadow:0 .3125rem .9375rem rgba(255,59,48,.3);transition:all .3s ease}.simple-record-btn.recording{background:#007aff;box-shadow:0 .3125rem .9375rem rgba(0,122,255,.3);transform:scale(1.1)}.btn-icon{width:3.125rem;height:3.125rem;display:flex;align-items:center;justify-content:center;margin-bottom:.625rem}.icon-start{color:#fff;font-size:2.5rem;line-height:1}.icon-stop{color:#fff;font-size:1.875rem;line-height:1}.btn-text{color:#fff;font-size:.875rem;font-weight:700}.recording-time{font-size:1.125rem;color:#333;font-family:monospace;font-weight:700;margin-top:.625rem;padding:.625rem 1.25rem;background:#fff;border-radius:1.5625rem;box-shadow:0 .125rem .625rem rgba(0,0,0,.1)}.status-message{position:fixed;bottom:3.125rem;left:50%;transform:translate(-50%);background:rgba(0,0,0,.8);color:#fff;padding:.625rem 1.25rem;border-radius:1.5625rem;font-size:.875rem;z-index:1000}
|
||||
|
|
@ -1 +1 @@
|
|||
.index-content-other[data-v-9599d5fa]{width:100%;height:100%;transition:opacity 1s ease;position:relative;background-color:#eff0f4}.index-content-down[data-v-9599d5fa]{position:absolute;bottom:1.25rem;left:50%;transform:translate(-50%)}.index-content-right[data-v-9599d5fa]{width:100%;border-radius:1.5625rem;display:flex;align-items:center;padding-top:3.125rem;font-size:1rem;position:relative}.index-content-right .index-content-title[data-v-9599d5fa]{position:absolute;top:1.875rem;left:1.875rem;display:flex;align-items:center}.index-content-right .index-content-title .shu[data-v-9599d5fa]{width:.625rem;height:1.5625rem;background:linear-gradient(to right,#0052c2,#00b4ff);border-radius:.625rem;margin-right:.9375rem}.index-content-right .index-content-title .shu-font[data-v-9599d5fa]{color:#415273;font-size:1.09375rem}.saomiao[data-v-9599d5fa]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;z-index:1}.saomiao .saoma-input[data-v-9599d5fa]{background-color:#fff;width:17.1875rem;height:2.8125rem;border-radius:.9375rem;padding-left:3.125rem;z-index:2}.saomiao .left-img[data-v-9599d5fa]{width:1.5625rem;height:1.5625rem;position:absolute;top:50%;left:.9375rem;transform:translateY(-50%);z-index:3}.saomiao .right-img[data-v-9599d5fa]{width:1.5625rem;height:1.5625rem;position:absolute;top:50%;right:6.875rem;transform:translateY(-50%);z-index:2}.blue-button[data-v-9599d5fa]{margin-left:.9375rem;width:5.3125rem;height:2.8125rem;border-radius:1.25rem;display:flex;justify-content:center;align-items:center;color:#007cff;font-size:.9375rem;background-color:#ddf0ff;border:.03125rem solid #007CFF}.big-ball[data-v-9599d5fa]{width:6.25rem;height:6.25rem;position:absolute;top:50%;left:-1.71875rem;transform:translateY(-50%);border-radius:50%;background-color:#dbe4f6}.big-ball .ball[data-v-9599d5fa]{width:4.6875rem;height:4.6875rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:50%;background-color:#cfddf1}.back-img[data-v-9599d5fa]{width:.9375rem;height:.9375rem;margin-left:3.125rem;margin-right:.625rem}.big-bgc[data-v-9599d5fa]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:34.375rem;height:34.375rem}.big-img[data-v-9599d5fa]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:28.125rem;height:28.125rem}.card[data-v-9599d5fa]{width:18.75rem;margin-left:4%;height:14.0625rem;box-shadow:.09375rem .1875rem .375rem .09375rem rgba(206,206,206,.5);background-color:#f4f5f7;border-radius:.9375rem;margin-top:.15625rem;margin-bottom:1.09375rem;padding:0 .78125rem;position:relative;display:flex;justify-content:center;align-items:center;flex-direction:column;overflow:hidden}.card-title[data-v-9599d5fa]{width:100%;height:4.0625rem;display:flex;align-items:center;justify-content:space-between}.main-title[data-v-9599d5fa]{display:flex;align-items:center;margin-top:2.1875rem;margin-bottom:.3125rem}.video-father[data-v-9599d5fa]{width:1.875rem;height:1.875rem;display:flex;justify-content:center;align-items:center;margin-left:.46875rem}.edit-img[data-v-9599d5fa]{width:1.25rem;height:.9375rem}.play-img[data-v-9599d5fa]{position:absolute;top:1.5625rem;right:.9375rem;width:4.0625rem;height:1.71875rem;font-size:.8125rem;border-radius:1.09375rem;border:.0625rem solid #999;display:flex;justify-content:center;align-items:center}.card-tags[data-v-9599d5fa]{position:absolute;top:1.5625rem;left:0;width:6.25rem;height:2.03125rem;font-size:.78125rem;display:flex;justify-content:center;align-items:center}.popup-any[data-v-9599d5fa]{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .5s ease;-webkit-backdrop-filter:blur(.03125rem);backdrop-filter:blur(.03125rem);background-color:rgba(236,237,241,.4);z-index:999}.mask[data-v-9599d5fa]{position:absolute;top:0;right:0;bottom:0;left:0}.rename-father[data-v-9599d5fa]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:18.75rem;height:14.0625rem;border-radius:.9375rem;box-shadow:.0625rem .125rem .25rem .0625rem rgba(0,0,0,.3);background-color:#fff;display:flex;flex-direction:column;align-items:center;padding:0 .9375rem;z-index:999}.rename-father .rename-title[data-v-9599d5fa]{width:100%;height:2.5rem;display:flex;justify-content:center;align-items:center;margin-top:.9375rem;margin-bottom:.625rem;font-size:1rem}.rename-father .rename-gray[data-v-9599d5fa]{width:100%;height:2.5rem;display:flex;color:#a7a7a7;align-items:center}.rename-father .rename-input[data-v-9599d5fa]{width:100%;height:2.5rem;display:flex;background-color:#f5f6fa;border-radius:.625rem;color:#a7a7a7;align-items:center;padding:0 .625rem;position:relative}.rename-father .rename-input .uni-input[data-v-9599d5fa]{font-size:.78125rem;width:100%}.rename-father .rename-input .left-img[data-v-9599d5fa]{width:1.5625rem;height:1.5625rem;margin-right:.46875rem}.rename-father .rename-input .right-img[data-v-9599d5fa]{position:absolute;right:.9375rem;top:50%;transform:translateY(-50%);width:.9375rem;height:.9375rem}
|
||||
.index-content-other[data-v-f71fcced]{width:100%;height:100%;transition:opacity 1s ease;position:relative;background-color:#eff0f4}.index-content-down[data-v-f71fcced]{position:fixed;bottom:1.25rem;left:50%;transform:translate(-50%)}.index-content-right[data-v-f71fcced]{width:100%;border-radius:1.5625rem;display:flex;align-items:center;padding-top:3.125rem;font-size:1rem;position:relative}.index-content-right .index-content-title[data-v-f71fcced]{position:absolute;top:1.875rem;left:1.875rem;display:flex;align-items:center}.index-content-right .index-content-title .shu[data-v-f71fcced]{width:.625rem;height:1.5625rem;background:linear-gradient(to right,#0052c2,#00b4ff);border-radius:.625rem;margin-right:.9375rem}.index-content-right .index-content-title .shu-font[data-v-f71fcced]{color:#415273;font-size:1.09375rem}.saomiao[data-v-f71fcced]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;z-index:1}.saomiao .saoma-input[data-v-f71fcced]{background-color:#fff;width:17.1875rem;height:2.8125rem;border-radius:.9375rem;padding-left:3.125rem;z-index:2}.saomiao .left-img[data-v-f71fcced]{width:1.5625rem;height:1.5625rem;position:absolute;top:50%;left:.9375rem;transform:translateY(-50%);z-index:3}.saomiao .right-img[data-v-f71fcced]{width:1.5625rem;height:1.5625rem;position:absolute;top:50%;right:6.875rem;transform:translateY(-50%);z-index:2}.blue-button[data-v-f71fcced]{margin-left:.9375rem;width:5.3125rem;height:2.8125rem;border-radius:1.25rem;display:flex;justify-content:center;align-items:center;color:#007cff;font-size:.9375rem;background-color:#ddf0ff;border:.03125rem solid #007CFF}.big-ball[data-v-f71fcced]{width:6.25rem;height:6.25rem;position:absolute;top:50%;left:-1.71875rem;transform:translateY(-50%);border-radius:50%;background-color:#dbe4f6}.big-ball .ball[data-v-f71fcced]{width:4.6875rem;height:4.6875rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border-radius:50%;background-color:#cfddf1}.back-img[data-v-f71fcced]{width:.9375rem;height:.9375rem;margin-left:3.125rem;margin-right:.625rem}.big-bgc[data-v-f71fcced]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:34.375rem;height:34.375rem}.big-img[data-v-f71fcced]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:28.125rem;height:28.125rem}.card[data-v-f71fcced]{width:18.75rem;margin-left:4%;height:14.0625rem;box-shadow:.09375rem .1875rem .375rem .09375rem rgba(206,206,206,.5);background-color:#f4f5f7;border-radius:.9375rem;margin-top:.15625rem;margin-bottom:1.09375rem;padding:0 .78125rem;position:relative;display:flex;justify-content:center;align-items:center;flex-direction:column;overflow:hidden}.card-title[data-v-f71fcced]{width:100%;height:4.0625rem;display:flex;align-items:center;justify-content:space-between}.main-title[data-v-f71fcced]{display:flex;align-items:center;margin-top:2.1875rem;margin-bottom:.3125rem}.video-father[data-v-f71fcced]{width:1.875rem;height:1.875rem;display:flex;justify-content:center;align-items:center;margin-left:.46875rem}.edit-img[data-v-f71fcced]{width:1.25rem;height:.9375rem}.play-img[data-v-f71fcced]{position:absolute;top:1.5625rem;right:.9375rem;width:4.0625rem;height:1.71875rem;font-size:.8125rem;border-radius:1.09375rem;border:.0625rem solid #999;display:flex;justify-content:center;align-items:center}.card-tags[data-v-f71fcced]{position:absolute;top:1.5625rem;left:0;width:6.25rem;height:2.03125rem;font-size:.78125rem;display:flex;justify-content:center;align-items:center}.popup-any[data-v-f71fcced]{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .5s ease;-webkit-backdrop-filter:blur(.03125rem);backdrop-filter:blur(.03125rem);background-color:rgba(236,237,241,.4);z-index:999}.mask[data-v-f71fcced]{position:absolute;top:0;right:0;bottom:0;left:0}.rename-father[data-v-f71fcced]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:18.75rem;height:14.0625rem;border-radius:.9375rem;box-shadow:.0625rem .125rem .25rem .0625rem rgba(0,0,0,.3);background-color:#fff;display:flex;flex-direction:column;align-items:center;padding:0 .9375rem;z-index:999}.rename-father .rename-title[data-v-f71fcced]{width:100%;height:2.5rem;display:flex;justify-content:center;align-items:center;margin-top:.9375rem;margin-bottom:.625rem;font-size:1rem}.rename-father .rename-gray[data-v-f71fcced]{width:100%;height:2.5rem;display:flex;color:#a7a7a7;align-items:center}.rename-father .rename-input[data-v-f71fcced]{width:100%;height:2.5rem;display:flex;background-color:#f5f6fa;border-radius:.625rem;color:#a7a7a7;align-items:center;padding:0 .625rem;position:relative}.rename-father .rename-input .uni-input[data-v-f71fcced]{font-size:.78125rem;width:100%}.rename-father .rename-input .left-img[data-v-f71fcced]{width:1.5625rem;height:1.5625rem;margin-right:.46875rem}.rename-father .rename-input .right-img[data-v-f71fcced]{position:absolute;right:.9375rem;top:50%;transform:translateY(-50%);width:.9375rem;height:.9375rem}
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 934 B |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |