转载自:https://juejin.cn/post/6844903759424782344
对原作者代码做了一些修改
思路:重新实现TextView的onTouchListener
class ClickMovementMethod : View.OnTouchListener {
private var longClickCallback: LongClickCallback? = null
private var downTime: Long = 0
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(v: View, event: MotionEvent): Boolean {
if (longClickCallback == null) {
longClickCallback = LongClickCallback(v)
}
val widget = v as TextView
// MovementMethod is set to null to prevent handling long-press events
widget.movementMethod = null
val text = widget.text
val spannable = Spannable.Factory.getInstance().newSpannable(text)
val action = event.action
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) {
var x = event.x.toInt()
var y = event.y.toInt()
x -= widget.totalPaddingLeft
y -= widget.totalPaddingTop
x += widget.scrollX
y += widget.scrollY
val layout = widget.layout
val line = layout.getLineForVertical(y)
val off = layout.getOffsetForHorizontal(line, x.toFloat())
val links = spannable.getSpans(off, off, ClickableSpan::class.java)
if (links.isNotEmpty()) {
if (action == MotionEvent.ACTION_DOWN) {
downTime = SystemClock.uptimeMillis()
v.postDelayed(longClickCallback, ViewConfiguration.getLongPressTimeout().toLong())
} else {
v.removeCallbacks(longClickCallback)
if (SystemClock.uptimeMillis() - downTime < ViewConfiguration.getLongPressTimeout().toLong()) {
links[0].onClick(widget)
}
}
return true
}
} else if (action == MotionEvent.ACTION_CANCEL) {
v.removeCallbacks(longClickCallback)
}
return false
}
private class LongClickCallback(private val view: View) : Runnable {
override fun run() {
var v = view
var consumed = v.performLongClick()
while (!consumed) {
v = v.parent as? View ?: break
consumed = v.performLongClick()
}
}
}
}
重新设置textview的onTouchListener
textView.setOnTouchListener(ClickMovementMethod())
1365

被折叠的 条评论
为什么被折叠?



