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

compose multiplatform reader3

前面都介绍过解码,布局等

现在介绍手势.桌面端

目录

手势

手势完成后,就是翻页

桌面端

国际化


手势

Canvas(modifier = Modifier.fillMaxSize().background(Color.Transparent).pointerInput(Unit) {awaitEachGesture {var zooming = falsevar dragging = false// pan惯性val panVelocityTracker = VelocityTracker()var pan: Offsetvar totalDrag = Offset.Zeroval down = awaitFirstDown(requireUnconsumed = false)val wasFlingActive = flingJob?.isActive == true // 记录按下时是否有fling动画try {pan = Offset.ZerototalDrag = Offset.ZeropanVelocityTracker.resetTracking()flingJob?.cancel()isFlingActive = falsedo {val event = awaitPointerEvent()val pointerCount = event.changes.sizeval zoomChange = event.calculateZoom()val panChange = event.calculatePan()val centroid = event.calculateCentroid()// 采集pan速度val uptime =event.changes.maxByOrNull { it.uptimeMillis }?.uptimeMillis?: 0Lpan += panChangetotalDrag += panChangepanVelocityTracker.addPosition(uptime, pan)// 检测是否开始拖拽if (totalDrag.getDistance() > 10f) {dragging = true}if (pointerCount > 1) {zooming = trueval newZoom = (zoomChange * vZoom).coerceIn(1f, 10f)val zoomFactor = newZoom / vZoom// 计算缩放中心点:手势中心相对于内容的位置// centroid 是手势中心在视图中的位置// 需要将其转换为相对于内容的位置val contentCenterX = centroid.x - offset.xval contentCenterY = centroid.y - offset.y// 计算新的偏移量,保持内容中心点不变val newOffsetX = centroid.x - contentCenterX * zoomFactorval newOffsetY = centroid.y - contentCenterY * zoomFactorvZoom = newZoomoffset = Offset(newOffsetX, newOffsetY)// 边界检查if (orientation == Vertical) {val scaledWidth = viewSize.width * vZoom// 在缩放过程中,需要根据当前缩放比例调整总高度val scaleRatio = vZoom / pdfViewState.vZoomval scaledHeight = pdfViewState.totalHeight * scaleRatioval minX = minOf(0f, viewSize.width - scaledWidth)val maxX = 0fval minY =if (scaledHeight > viewSize.height) viewSize.height - scaledHeight else 0fval maxY = 0foffset = Offset(offset.x.coerceIn(minX, maxX),offset.y.coerceIn(minY, maxY))} else {val scaledHeight = viewSize.height * vZoomval scaleRatio = vZoom / pdfViewState.vZoomval scaledWidth = pdfViewState.totalWidth * scaleRatioval minY = minOf(0f, viewSize.height - scaledHeight)val maxY = 0fval minX =if (scaledWidth > viewSize.width) viewSize.width - scaledWidth else 0fval maxX = 0foffset = Offset(offset.x.coerceIn(minX, maxX),offset.y.coerceIn(minY, maxY))}pdfViewState.updateOffset(offset)event.changes.fastForEach { if (it.positionChanged()) it.consume() }} else {// 单指拖动if (!zooming) {offset += panChange
http://www.dtcms.com/a/392388.html

相关文章:

  • Redis 入门与实践
  • 【OpenGL】texture 纹理
  • agentscope以STUDIO方式调用MCP服务
  • 无公网 IP 访问群晖 NAS:神卓 N600 的安全解决方案(附其他方法风险对比)
  • Redis最佳实践——性能优化技巧之Pipeline 批量操作
  • Java-130 深入浅出 MySQL MyCat 深入解析 核心配置文件 server.xml 使用与优化
  • 业主信息查询功能测试指南
  • WinDivert学习文档之四-————卸载
  • 分布式链路追踪关键指标实战:精准定位服务调用 “慢节点” 全指南(二)
  • DuckDB客户端API之ADBC官方文档翻译
  • 区块链技术应用开发:智能合约进阶与多链生态落地实践
  • 分布式专题——13 RabbitMQ之高级功能
  • 神经风格迁移(Neural Style Transfer)
  • Chromium 138 编译指南 Ubuntu 篇:源码获取与版本管理(四)
  • R 语言入门实战|第九章 循环与模拟:用自动化任务解锁数据科学概率思维
  • [论文阅读] 人工智能 + 软件工程 | 4907个用户故事验证!SEEAgent:解决敏捷估计“黑箱+不协作”的终极方案
  • 鸿蒙Next ArkTS卡片开发指南:从入门到实战
  • 【绕过disable_function】
  • 使用云手机运行手游的注意事项有哪些?
  • 【数据结构】利用堆解决 TopK 问题
  • 2025陇剑杯现场检测
  • openharmony之充电空闲状态定制开发
  • 【开题答辩全过程】以 python的线上订餐系统为例,包含答辩的问题和答案
  • (附源码)基于Spring Boot的校园心理健康服务平台的设计与实现
  • 微信小程序开发教程(十八)
  • 寰宇光锥舟架构图
  • Spring Bean生命周期全面解析
  • [vibe code追踪] 侧边栏UI管理器 | showSidebarContent
  • 嵌入式ARM架构学习9——IIC
  • 多线程——线程安全的练习加感悟