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