android 新闻点击事件,Android篇textview中片段响应点击事件(SpannableString)

项目需求

点击textView中的一小段文字,弹一个dialog框

失败解决方案

刚开始是用了两个textView水平布局,可想而知,当第一个textView快占满一行,还未换行时,第二个textView很可能出现换行排版问题

用spannableString的问题

小段文字有下划线

点击textView中的小段文字时,系统会当做url处理,给点击部分的text加一个蓝色的背景

解决方案

public class TouchableSpan extends ClickableSpan {

private boolean mIsPressed;

private int mPressedBackgroundColor;

private int mNormalTextColor;

private int mPressedTextColor;

public TouchableSpan(int normalTextColor, int pressedTextColor, int pressedBackgroundColor) {

mNormalTextColor = normalTextColor;

mPressedTextColor = pressedTextColor;

mPressedBackgroundColor = pressedBackgroundColor;

}

public void setPressed(boolean isSelected) {

mIsPressed = isSelected;

}

@Override

public void updateDrawState(TextPaint ds) {

super.updateDrawState(ds);

ds.setColor(mIsPressed ? mPressedTextColor : mNormalTextColor);

ds.bgColor = mIsPressed ? mPressedBackgroundColor : 0x00eeeeee;

ds.setUnderlineText(false);

}

@Override

public void onClick(View widget) {

//todo

}

}

class LinkTouchMovementMethod extends LinkMovementMethod {

private TouchableSpan mPressedSpan;

@Override

public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

mPressedSpan = getPressedSpan(textView, spannable, event);

if (mPressedSpan != null) {

mPressedSpan.setPressed(true);

Selection.setSelection(spannable, spannable.getSpanStart(mPressedSpan),

spannable.getSpanEnd(mPressedSpan));

}

} else if (event.getAction() == MotionEvent.ACTION_MOVE) {

TouchableSpan touchedSpan = getPressedSpan(textView, spannable, event);

if (mPressedSpan != null && touchedSpan != mPressedSpan) {

mPressedSpan.setPressed(false);

mPressedSpan = null;

Selection.removeSelection(spannable);

}

} else {

if (mPressedSpan != null) {

mPressedSpan.setPressed(false);

super.onTouchEvent(textView, spannable, event);

}

mPressedSpan = null;

Selection.removeSelection(spannable);

}

return true;

}

TouchableSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) {

int x = (int) event.getX();

int y = (int) event.getY();

x -= textView.getTotalPaddingLeft();

y -= textView.getTotalPaddingTop();

x += textView.getScrollX();

y += textView.getScrollY();

Layout layout = textView.getLayout();

int line = layout.getLineForVertical(y);

int off = layout.getOffsetForHorizontal(line, x);

TouchableSpan[] link = spannable.getSpans(off, off, TouchableSpan.class);

TouchableSpan touchedSpan = null;

if (link.length > 0) {

touchedSpan = link[0];

}

return touchedSpan;

}

}

最后别忘了加上

mStartPageTermsCondition.setMovementMethod(new LinkTouchMovementMethod());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值