SelectTextHelper icon indicating copy to clipboard operation
SelectTextHelper copied to clipboard

游标拖动到文本末尾依然有问题

Open magicalapp opened this issue 3 years ago • 4 comments

如题。 ①当刚好拖动到文本的末尾,是没有问题的。(图一)

②但是这个时候继续往右滑居然还可以继续滑动一个空格这个时候游标已经不正常显示了。(如图二)

③然后上下滑动文本,右侧游标就会出现选中异常了(图三)

这已是昨天应用了修复游标异常的代码后还发现的问题,亦可以看文末的GIF动画(有点模糊)

图一: Screenshot_2022-08-09-09-18-42-396_com.magicalstory.reader.jpg

图二: Screenshot_2022-08-09-09-18-49-485_com.magicalstory.reader.jpg

图三: Screenshot_2022-08-09-09-18-53-871_com.magicalstory.reader.jpg

GIF展示: Video_20220809_092154_494.gif

magicalapp avatar Aug 09 '22 01:08 magicalapp

滚动还会时换行不准确这个还是得看最新代码的哦,应该是修复了的,用旧的java代码的话得改两处。 图二这个应该是个bug 😂

java旧代码需要改的两个地方:

private fun showCursorHandle(cursorHandle: CursorHandle?) {
    val layout = mTextView.layout
    val offset = if (cursorHandle!!.isLeft) mSelectionInfo.mStart else mSelectionInfo.mEnd
    var x = layout.getPrimaryHorizontal(offset).toInt()
    var y = layout.getLineBottom(layout.getLineForOffset(offset))

    // 右游标
    // mSelectionInfo.mEnd != 0 不是第一位
    // x == 0 右游标在最后面
    // 把右游标水平坐标定位在减去一个字的线条右侧
    // 把右游标底部线坐标定位在上一行
    if (!cursorHandle.isLeft && mSelectionInfo.mEnd != 0 && x == 0) {
        x = layout.getLineRight(layout.getLineForOffset(mSelectionInfo.mEnd - 1)).toInt()
        y = layout.getLineBottom(layout.getLineForOffset(mSelectionInfo.mEnd - 1))
    }
    cursorHandle.show(x, y)
}
private fun updateCursorHandle() {
    mTextView.getLocationInWindow(mTempCoors)
    val layout = mTextView.layout
    if (isLeft) {
        mPopupWindow.update(
            layout.getPrimaryHorizontal(mSelectionInfo.mStart).toInt() - mWidth + extraX,
            layout.getLineBottom(layout.getLineForOffset(mSelectionInfo.mStart)) + extraY,
            -1,
            -1
        )
    } else {
        var horizontalEnd = layout.getPrimaryHorizontal(mSelectionInfo.mEnd).toInt()
        var lineBottomEnd =
            layout.getLineBottom(layout.getLineForOffset(mSelectionInfo.mEnd)) // 右游标 // mSelectionInfo.mEnd != 0 不是第一位
        // horizontalEnd == 0 右游标在最后面
        // 把右游标水平坐标定位在减去一个字的线条右侧
        // 把右游标底部线坐标定位在上一行
        if (mSelectionInfo.mEnd != 0 && horizontalEnd == 0) {
            horizontalEnd =
                layout.getLineRight(layout.getLineForOffset(mSelectionInfo.mEnd - 1))
                    .toInt()
            lineBottomEnd =
                layout.getLineBottom(layout.getLineForOffset(mSelectionInfo.mEnd - 1))
        }
        mPopupWindow.update(horizontalEnd + extraX, lineBottomEnd + extraY, -1, -1)
    }
}

ITxiaoguang avatar Aug 09 '22 01:08 ITxiaoguang

val layout = mTextView.layout
    val offset = if (cursorHandle!!.isLeft) mSelectionInfo.mStart else mSelectionInfo.mEnd
    var x = layout.getPrimaryHorizontal(offset).toInt()
    var y = layout.getLineBottom(layout.getLineForOffset(offset))

    // 右游标
    // mSelectionInfo.mEnd != 0 不是第一位
    // x == 0 右游标在最后面
    // 把右游标水平坐标定位在减去一个字的线条右侧
    // 把右游标底部线坐标定位在上一行
    if (!cursorHandle.isLeft && mSelectionInfo.mEnd != 0 && x == 0) {
        x = layout.getLineRight(layout.getLineForOffset(mSelectionInfo.mEnd - 1)).toInt()
        y = layout.getLineBottom(layout.getLineForOffset(mSelectionInfo.mEnd - 1))
    }
    cursorHandle.show(x, y)

根据kotlin代码,修改了我引入的java代码,确实修复了滚动后handler指示不正确的问题,但是那个图二继续往右滑游标显示异常还没修复。呜呜,我也想用最新版的呀,但是最新版还没有支持返回选中文字的pos,我java自己修改了interface,奈何还不会kotlin。

magicalapp avatar Aug 09 '22 01:08 magicalapp

问题不大。图二应该要debug一下就能看出原因了哈,要是框架的问题,反馈一下,后面的人用了就不用踩坑了。

ITxiaoguang avatar Aug 09 '22 02:08 ITxiaoguang

感觉可能是末尾多了一个空格导致的,你可以把空格转成 \u00A0

  textView.text = textView.text.toString()
                // 半角空格(英文符号) 转 不间断空格
                .replace("\u0020", "\u00A0")
                // 全角空格(中文符号) 转 不间断空格
                .replace("\u3000", "\u00A0")

可以参考一下 https://github.com/ITxiaoguang/SelectTextHelper/issues/10

ITxiaoguang avatar Sep 16 '22 05:09 ITxiaoguang