在某些应用中,例如Plaid甚至是Chrome浏览器,文本的某些部分会加下划线,以表明它们是一个可点击的链接,可以打开浏览器窗口或新标签页。单击这些链接后,整个文本的背景颜色将更改为下划线颜色。我试过看格子花呢的来源来复制这种效果,却没有成功。我想要完成的是这种效果:
答案 0 :(得分:2)
在res / drawable / my_background.xml
中创建XML资源文件<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape>
<solid android:color="#343434" />
</shape>
</item>
</selector>
并将其设置为TextView as Background like
<TextView
android:id="@+id/tvMytv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/my_background" />
答案 1 :(得分:2)
我认为代码的这一部分会产生这种效果:
它实际上基于这个问题:
public class LinkTouchMovementMethod extends LinkMovementMethod {
private static LinkTouchMovementMethod instance;
private TouchableUrlSpan pressedSpan;
public static MovementMethod getInstance() {
if (instance == null)
instance = new LinkTouchMovementMethod();
return instance;
}
@Override
public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) {
boolean handled = false;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
pressedSpan = getPressedSpan(textView, spannable, event);
if (pressedSpan != null) {
pressedSpan.setPressed(true);
Selection.setSelection(spannable, spannable.getSpanStart(pressedSpan),
spannable.getSpanEnd(pressedSpan));
handled = true;
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
TouchableUrlSpan touchedSpan = getPressedSpan(textView, spannable, event);
if (pressedSpan != null && touchedSpan != pressedSpan) {
pressedSpan.setPressed(false);
pressedSpan = null;
Selection.removeSelection(spannable);
}
} else {
if (pressedSpan != null) {
pressedSpan.setPressed(false);
super.onTouchEvent(textView, spannable, event);
handled = true;
}
pressedSpan = null;
Selection.removeSelection(spannable);
}
return handled;
}
private TouchableUrlSpan 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);
TouchableUrlSpan[] link = spannable.getSpans(off, off, TouchableUrlSpan.class);
TouchableUrlSpan touchedSpan = null;
if (link.length > 0) {
touchedSpan = link[0];
}
return touchedSpan;
}
}