单指多指切换、fling到边界时的问题
Closed this issue · 5 comments
594happyboy commented
1.单指多指切换问题:
首先单指滑动一段距离,然后再一根指头触摸进行缩放,这时图片会瞬移一段距离,体验非常不好。我看了一下代码,貌似是单指到多指切换时的焦点发生了改变,我下载了源码改动如下,自己大概测试是没问题,由于也没细看源码,所以还请大佬看一下是否有问题。
//CoreZoomUtils.kt
fun calculateTransformOffset(
currentScale: Float,
currentOffset: OffsetCompat,
targetScale: Float,
centroid: OffsetCompat,
pan: OffsetCompat,
gestureRotate: Float,
pointCountChanged: Boolean //加了个触摸点数量是否变化的判断。除了下面 TouchHelper.kt 的调用,其他地方都传入的 false
): OffsetCompat {
//省略..
//根据触摸数量是否发生了变化来决定是否平移
val targetRestoreScaleCurrentOffset = if (pointCountChanged) {
(restoreScaleCurrentOffset + centroid / oldScale).rotateBy(gestureRotate) - (centroid / newScale)
} else {
(restoreScaleCurrentOffset + centroid / oldScale).rotateBy(gestureRotate) - (centroid / newScale + pan / oldScale)
}
val targetOffset = targetRestoreScaleCurrentOffset * newScale * -1f
return targetOffset
}
//TouchHelper.kt
private var lastPointCount = 0 //全局变量
init {
gestureDetector = UnifiedGestureDetector(
onGestureCallback = { scaleFactor: Float, focus: OffsetCompat, panChange: OffsetCompat, pointCount: Int ->
coroutineScope.launch {
val pointCountChanged = lastPointCount != pointCount //是否触摸点数量发生变化
//省略..
if (supportOneFingerScale && pointCount == 1 && doubleTapPressPoint != null) {
//省略..
zoomable.gestureTransform(
centroid = doubleTapPressPoint,
panChange = OffsetCompat.Zero,
zoomChange = scale,
rotationChange = 0f,
pointCountChanged = pointCountChanged
)
} else {
oneFingerScaleExecuted = false
if (supportTwoFingerScale || supportDrag) {
//省略..
zoomable.gestureTransform(
centroid = focus,
panChange = finalPan,
zoomChange = finalZoom,
rotationChange = 0f,
pointCountChanged = pointCountChanged
)
}
}
lastPointCount = pointCount
}
},
)
}
2.fling到边界时的问题:
快速fling到边界时会发生图片该边进入到屏幕内部,看起来就是逃脱了边界限制,不过只有大概一帧的时间。
https://github.com/panpf/zoomimage/assets/41738211/8dc55c92-edc1-42c0-ab46-8e37a54e06c0
最后感谢大佬这个库真的好用😄
panpf commented
首先需要补充一下以下信息:
- zoomimage 版本:
- android 版本:
- 机型以及 rom 版本:
问题 1:我理解的是你的操作过程是单指左右滑动,抬起后再点击一次,然后再迅速按住屏幕上下滑动缩放,我按照此方法在我的 demo 中没有复现问题,如果我理解的有误还请详细说明你的操作过程活着录制一个视频
问题 2:我理解了你的意思,视频中也很清晰的展示了,但在我的 demo 中依然没有复现。按照代码逻辑是不会出现此问题的,因为滑动边界是随着缩放倍数改变的,在 fling 的过程中滑动边界不会改变,每一次 fling 产生的位移都会限制在滑动边界内。我猜测有可能是你的 ROM 给所有 View 都加了 over 效果导致的,建议你在其它的设备或着模拟器上试试。
594happyboy commented
zoomimage 版本:1.0.0
android 版本:
机型以及 rom 版本:华为P50E (鸿蒙4),nova 6 SE(鸿蒙 3),OPPO k7x(ColorOS V12.1,安卓12,型号PERM00)
问题1:
如下视频,用的1.0.0 的 demo 演示的。流程是先一个指头触摸进行拖动,然后第一根不抬起,第二根手指触摸上去,进行缩放操作,这时图片就会瞬移一段距离。
SVID_20240103_163410_1.mp4
问题2:
确实应该是华为系手机的问题,我换oppo后就好了😅
panpf commented
问题 1 已经复现,择日修复
你再多用用看有没有别的问题
594happyboy commented
好的,感谢回复