From 4a30ac04b7b697e0be515002546e005dcc3379a2 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 11 May 2020 15:13:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=AF=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E6=96=87=E5=AD=97=E5=9C=A8=E8=A7=A6=E6=91=B8`=E5=85=A8?= =?UTF-8?q?=E9=83=A8`=E6=8C=89=E9=92=AE=E6=98=AF=E9=AB=98=E5=BA=A6?= =?UTF-8?q?=E4=BC=9A=E5=8F=98=E6=9B=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/view/CustomLinkMovementMethod.java | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/gh/common/view/CustomLinkMovementMethod.java b/app/src/main/java/com/gh/common/view/CustomLinkMovementMethod.java index 8bd54ad665..ef7c3ad4d4 100644 --- a/app/src/main/java/com/gh/common/view/CustomLinkMovementMethod.java +++ b/app/src/main/java/com/gh/common/view/CustomLinkMovementMethod.java @@ -1,25 +1,63 @@ package com.gh.common.view; +import android.text.Layout; +import android.text.Selection; import android.text.Spannable; import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; import android.view.MotionEvent; import android.view.ViewGroup; import android.view.ViewParent; import android.widget.TextView; public class CustomLinkMovementMethod extends LinkMovementMethod { - + @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { - boolean b = super.onTouchEvent(widget, buffer, event); + int action = event.getAction(); + boolean isTouchEventConsumed = false; + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + int x = (int) event.getX(); + int y = (int) event.getY(); + + x -= widget.getTotalPaddingLeft(); + y -= widget.getTotalPaddingTop(); + + x += widget.getScrollX(); + y += widget.getScrollY(); + + Layout layout = widget.getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + + ClickableSpan[] links = buffer.getSpans(off, off, ClickableSpan.class); + + if (links.length != 0) { + ClickableSpan link = links[0]; + if (action == MotionEvent.ACTION_UP) { + link.onClick(widget); + } else if (action == MotionEvent.ACTION_DOWN) { + // 下面这行代码会造成触摸 clickbleSpan 时 RecyclerView 的 item 高度变更 : ( + // 看起来像是跟文字选择相关的东西,反正我们的 clickSpan 也不让选,直接屏蔽掉了 +// Selection.setSelection(buffer, +// buffer.getSpanStart(link), +// buffer.getSpanEnd(link)); + } + isTouchEventConsumed = true; + } else { + Selection.removeSelection(buffer); + } + } + //解决点击事件冲突问题 - if (!b && event.getAction() == MotionEvent.ACTION_UP) { + if (!isTouchEventConsumed && event.getAction() == MotionEvent.ACTION_UP) { ViewParent parent = iterateViewParentForClicking(widget.getParent());//处理widget的父控件点击事件 - if (parent != null && parent instanceof ViewGroup) { + if (parent instanceof ViewGroup) { return ((ViewGroup) parent).performClick(); } } - return b; + return false; } @@ -33,14 +71,13 @@ public class CustomLinkMovementMethod extends LinkMovementMethod { } return null; } - + public static CustomLinkMovementMethod getInstance() { if (sInstance == null) sInstance = new CustomLinkMovementMethod(); - + return sInstance; } - - + private static CustomLinkMovementMethod sInstance; - + } \ No newline at end of file