您的位置:首页 > 其它

TextView的内部链接支持长按

2015-07-09 16:27 330 查看
先创建一个支持处理长按事件的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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: