Android 实现clickspan显示及点击效果
在很多社交应用中需要实现类似新浪微博的@某某某的文本显示及点击效果。
如下图
下面来说下具体的实现步骤。
设置颜色及处理点击事件
设置颜色及点击事件处理需要自定义clickspan,代码如下:
public class WeiBoContentClickableSpan extends ClickableSpan {private Context mContext;public WeiBoContentClickableSpan(Context context) { mContext = context;}@Overridepublic void onClick(View widget) {}@Overridepublic void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(0xff507daf); ds.setUnderlineText(false);}}
设置点击效果
实现点击效果需要自定义LinkMovementMethod类,代码如下:
/ * Created by pkhope on 2016/6/16. */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) { if (action == 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); } else if (action == 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])); } else if (action == MotionEvent.ACTION_MOVE){ buffer.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); Selection.removeSelection(buffer); } return true; } else { Selection.removeSelection(buffer); } }// return super.onTouchEvent(widget, buffer, event); return false; }}
总结
设置点击效果的关键点是处理点击后背景色不消失的问题。
具体代码可以参考项目 https://github.com/pkhope/weibo
关键字:android, tspa, link, int
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!