TextView的内部链接支持长按
2015-07-09 16:27
330 查看
先创建一个支持处理长按事件的span
再重写一个LinkMovementMethod
使用代码:
TextView textView;
textView.setText(text);//此处text内加入LongClickableSpan的配置
textView.setMovementMethod(LongClickLinkMovementMethod.getInstance());
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());
相关文章推荐
- 代码流程分析二:Settings-蓝牙分析-加载界面
- opencv hello.obj : error LNK2001: unresolved external symbol _cvNamedWindow
- JavaScript数据结构深度剖析
- 浅谈NGUI中的淡入淡出效果
- lsb_release 命令找不到
- C# 工具方法集
- Windows下 wamp+tomcat 环境整合
- Unity 各级别 技术面试
- 硬盘基本知识:物理构造和逻辑单元
- android:TextSize问题
- 【php】php文件中不需要php结束标记的好处
- Object.defineProperty
- 关闭Linux(Centos 7.0)蜂鸣器
- usb驱动开发知识
- Json lib 抛出 NestableRuntimeException
- GRE写作必备句型
- 刻度尺
- Python 改变和获取当前工作目录
- Dialog背景透明
- 51nod1106 质数检测