简体   繁体   中英

Expand touch area of ClickableSpan

I have a TextView in which I set HTML text. This text has many links. When you tap a link, it does not always trigger the onClick method. So, I am trying to expand the area of ClickableSpan, so that it is always responsive.

int start = strBuilder.getSpanStart(span);
int end = strBuilder.getSpanEnd(span);
int flags = strBuilder.getSpanFlags(span);
final ClickableSpan clickable = new ClickableSpan() {
  public void onClick(View view) {
    getTouchActions(span.getURL());
  }
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);

The CustomMovementMethod has to extend ScrollingMovementMethod and override the onTouchEvent method. In order to add some extra space you have to define it in you dimensions and use that in the start/end span.

@Override
  public boolean onTouchEvent(TextView widget, Spannable buffer,
                              MotionEvent event) {
int action = event.getAction();

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);

  int startSpan = off - context.getResources().getDimension(R.dimen.extra_space_start);
  int endSpan = off + context.getResources().getDimension(R.dimen.extra_space_end);

  ClickableSpan[] link = buffer.getSpans(startSpan, endSpan, ClickableSpan.class);

  if (link.length != 0) {
    if (action == MotionEvent.ACTION_UP) {
      link[0].onClick(widget);
    } else if (action == MotionEvent.ACTION_DOWN) {
      Selection.setSelection(buffer,
          buffer.getSpanStart(link[0]),
          buffer.getSpanEnd(link[0]));
    }

    return true;
  } else {
    Selection.removeSelection(buffer);
  }
}

return super.onTouchEvent(widget, buffer, event);

}

You can call your custom link movement like this:

textView.setMovementMethod(new CustomLinkMovementMethod(context));
textView.setLinksClickable(true);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM