panpf/zoomimage

单指多指切换、fling到边界时的问题

Closed this issue · 5 comments

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 效果导致的,建议你在其它的设备或着模拟器上试试。

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 已经复现,择日修复

你再多用用看有没有别的问题

好的,感谢回复

panpf commented

1.0.1 版本已修复
Fixed in version 1.0.1