textview富文本设置clickspan,按下后拖动,textview的背景不会恢复,求大神救救孩子吧。

春华-秋实 2019-06-28 02:58:02
仿照微信的评论功能,点击评论的时候背景设置变色,但是拖动的时候背景有时候没有恢复,求大神救救孩子吧。
下面的代码是自定义clickspan
public class MyClickableSpan extends ClickableSpan {
private onTextClickListener mListener;

public MyClickableSpan(onTextClickListener listener) {
this.mListener = listener;
}

@Override
public void onClick(View widget) {
mListener.textClick(widget);
}

@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
mListener.setStyle(ds);
}
}

下面的代码是LinkMovementMethod
public class MyLinkMovementMethod extends LinkMovementMethod {

private static LinkMovementMethod sInstance;

public static MovementMethod getInstance() {
if (sInstance == null)
sInstance = new MyLinkMovementMethod();

return sInstance;
}

@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {

int action = event.getAction();

if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN ||
action == MotionEvent.ACTION_MOVE) {

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[] link = buffer.getSpans(off, off, ClickableSpan.class);

if (link.length != 0) {
switch (action){
case MotionEvent.ACTION_UP:
link[0].onClick(widget);

buffer.setSpan(new BackgroundColorSpan(Color.TRANSPARENT),
buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Selection.removeSelection(buffer);
break;
case MotionEvent.ACTION_DOWN:
buffer.setSpan(new BackgroundColorSpan(Color.GRAY),
buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
break;
case MotionEvent.ACTION_MOVE:
buffer.setSpan(new BackgroundColorSpan(Color.TRANSPARENT),
buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Selection.removeSelection(buffer);
break;
}
return false;
} else {
Selection.removeSelection(buffer);
return false;
}
}
// return super.onTouchEvent(widget, buffer, event);
return false;
}
}

求大神救救孩子,这是什么原因啊?
...全文
183 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
春华-秋实 2019-06-28
  • 打赏
  • 举报
回复
引用 1 楼 m-oj 的回复:
加个action_cancel的处理,恢复背景
感谢老哥,已解决,通过监听motionevent的事件,确实是要添加Action_Cancel,只是只添加action_cancel做恢复操作还不行。我同时更改了linkmovementmethod的方法,解决。可笑我之前还想通过事件拦截不让textview接受down event,证明你思路是对的。
m-oj 应用层 2019-06-28
  • 打赏
  • 举报
回复
加个action_cancel的处理,恢复背景

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧