TextView的内部链接支持长按

原创 2015年07月09日 16:27:27

先创建一个支持处理长按事件的span

public class LongClickableSpan extends ClickableSpan View.OnClickListener l;{
    View.OnClickListener l;
    OnLongClickListener mOnLongClickListener = null;

    public LongClickableSpan(String text, OnClickListener l, OnLongClickListener ll, Context mContext) {
        super(text, l, mContext);
        mOnLongClickListener = ll;
    }

    @Override
    public void onClick(View v) {
        if (l != null) {
            l.onClick(v);
        }
    }

    public void onLongClick(View view) {
        if (mOnLongClickListener != null) {
            mOnLongClickListener.onLongClick(view);
        }
    }
}

再重写一个LinkMovementMethod

public class LongClickLinkMovementMethod extends LinkMovementMethod {
    private static LongClickLinkMovementMethod sInstance;
    private static int LONG_CLICK_TIME = 1000;
    private Long lastClickTime = 0l;
    private int lastX = 0;
    private int lastY = 0;
    // 本次点击是否已相应长按事件
    private boolean LongClickCalled = false;

    public static LinkMovementMethod getInstance() {
        if (sInstance == null) {
            sInstance = new LongClickLinkMovementMethod();
        }
        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();
            lastX = x;
            lastY = y;
            int deltaX = Math.abs(x - lastX);
            int deltaY = Math.abs(y - lastY);

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

            LongClickableSpan[] link = buffer.getSpans(off, off, LongClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    // 相应长按事件后不再相应点击事件
                    if (!LongClickCalled) {
                        link[0].onClick(widget);
                    }
                    LongClickCalled = false;
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
                    lastClickTime = System.currentTimeMillis();
                } else if (action == MotionEvent.ACTION_MOVE) {
                    long delta = System.currentTimeMillis() - lastClickTime;
                    if (delta > LONG_CLICK_TIME && !LongClickCalled && deltaX < 10 && deltaY < 10) {
                        LongClickCalled = true;
                        link[0].onLongClick(widget);
                    }
                }
                return true;
            }
        } else if (action == MotionEvent.ACTION_CANCEL) {
            LongClickCalled = false;
        }

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

}

使用代码:

TextView textView;
textView.setText(text);//此处text内加入LongClickableSpan的配置
textView.setMovementMethod(LongClickLinkMovementMethod.getInstance());


相关文章推荐

Jsonp调用网易云音乐API搜索播放歌曲

Jsonp调用网易云音乐API搜索播放歌曲 效果如下图: 基本就是正常的文件播放,暂停,停止,设置循环,随机播放,加速,减速,上一曲,下一曲,再多个选择本地文件加入到播放列表的功能。 然后想着给...

Scrapy 入门笔记(4) --- 使用 Pipeline 保存数据

最近学习用 Scrapy 框架写爬虫,将学习过程中用到的解析技术,Scrapy 的各个模块使用与进阶到分布式爬虫学到的知识点、遇到的问题以及解决方法记录于此,以作总结与备忘,也希望对需要的同学有所帮助...
  • Ahri_J
  • Ahri_J
  • 2017年05月18日 15:57
  • 1724

TextView的内部链接与onClick事件冲突

在一个TextView内显示富态文本,一般是通过TextView

论TextView的超链接使用、显示表情、Html语法支持、跑马灯效果的实现

传送门:在Android實作HTML TextView與AutoLink使用的建議方式 Android的TextView除了可以显示文字,还可以使用HTML语法来调整文字样式,无需特地使用W...
  • Goo_x
  • Goo_x
  • 2016年03月12日 17:41
  • 651

解决链接ClickableSpan中点击后与ListView中item的长按冲突的问题

项目中碰到一个问题,情景是这样的: 有一个ListView,每个item中有一个TextView,这个TextView实现了LongClick事件,这个TextView中又添加了Clickabl...
  • ylxbcs
  • ylxbcs
  • 2015年04月02日 21:38
  • 998

TextView超链接自定义样式

  • 2015年10月12日 22:45
  • 1.64MB
  • 下载

Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性

在Android中,TextView是我们最常用的用来显示文本的控件。   一般情况下,TextView中的文本都是一个样式。那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TextView的内部链接支持长按
举报原因:
原因补充:

(最多只允许输入30个字)