本文参考 http://www.cnblogs.com/luction/p/3645210.html
需求再操蛋也是木有办法
本文代码 textView 包含3个功能 1、文字中添加表情 2、文字中添加图片并实现点击3、同一个textView中的文字设置不同的字体大小与颜色
效果如图
一切都在代码里 上代码
public class MainActivity extends Activity implements OnClickListener {
private TextView tv;
private Map<String, Integer> imageMap = new LinkedHashMap<String, Integer>();
private List<String> imageKeys;
private int TEXT_INDEX = 1;
private Button button1,button2,button3;
private ClickableImageSpan clickableImageSpan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
tv = (TextView) findViewById(R.id.tv1);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
formatMatter();
}
private void initData() {
imageMap.put("[阴险]", R.drawable.f041);
imageMap.put("[取消]", R.drawable.remember_un);
imageMap.put("[点击]", R.drawable.remember_n);
Set<String> keySet = imageMap.keySet();
imageKeys = new ArrayList<String>();
imageKeys.addAll(keySet);
}
private void formatMatter(){
String showText = getResources().getString(R.string.survey_ba);
tv.setText(showText);
if(TEXT_INDEX == 3){
SpannableString spannableString = new SpannableString(showText);
spannableString.setSpan(new TextAppearanceSpan(MainActivity.this, R.style.text_style), 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(spannableString);
}else{
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), (Integer) imageMap.values().toArray()[TEXT_INDEX]);
if(bitmap != null){
int rawHeigh = bitmap.getHeight();
int rawWidth = bitmap.getHeight();
int newHeight = 100;
int newWidth = 100;
float heightScale = ((float) newHeight) / rawHeigh;
float widthScale = ((float) newWidth) / rawWidth;
// 新建立矩阵
Matrix matrix = new Matrix();
matrix.postScale(heightScale, widthScale);
// 设置图片的旋转角度
// matrix.postRotate(-30);
// 设置图片的倾斜
// matrix.postSkew(0.1f, 0.1f);
// 将图片大小压缩
// 压缩后图片的宽和高以及kB大小均会变化
Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, rawWidth, rawHeigh, matrix, true);
ImageSpan imageSpan = new ImageSpan(MainActivity.this, newBitmap);
String emojiStr = imageKeys.get(TEXT_INDEX);
SpannableString spannableString = new SpannableString(emojiStr);
clickableImageSpan = new ClickableImageSpan(newBitmap) {
@Override
public void onClick(View view) {
if(TEXT_INDEX == 1){
TEXT_INDEX = 2;
}else{
TEXT_INDEX = 1;
}
formatMatter();
//Toast.makeText(MainActivity.this, "点击了", 2000).show();
}
};
if(TEXT_INDEX == 0){
spannableString.setSpan(imageSpan, emojiStr.indexOf('['), emojiStr.indexOf(']') + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}else{
tv.setMovementMethod(ClickableMovementMethod.getInstance());
spannableString.setSpan(clickableImageSpan, emojiStr.indexOf('['), emojiStr.indexOf(']') + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.append(spannableString);
}else{
int index = tv.getSelectionStart();
StringBuilder stringBuilder = new StringBuilder(showText);
stringBuilder.insert(index, imageKeys.get(TEXT_INDEX));
tv.setText(stringBuilder.toString());
//如果是为ed 则增加下行代码
//setSelection(index + imageKeys.get(TEXT_INDEX).length());
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//静态表情
case R.id.button1:
TEXT_INDEX = 0;
formatMatter();
break;
//单选按钮
case R.id.button2:
TEXT_INDEX = 1;
formatMatter();
break;
//文字标题突出
case R.id.button3:
TEXT_INDEX = 3;
formatMatter();
break;
default:
break;
}
}
}
//------------------------------------------------------------------------------------------------------------分割
ClickableImageSpan类代码
public abstract class ClickableImageSpan extends ImageSpan{
public ClickableImageSpan(Drawable d) {
super(d);
}
@SuppressWarnings("deprecation")
public ClickableImageSpan(Bitmap b) {
super(b);
}
public abstract void onClick(View view);
}
//------------------------------------------------------------------------------------------------------------分割
ClickableMovementMethod类代码
public class ClickableMovementMethod extends LinkMovementMethod {
private static ClickableMovementMethod sInstance;
public static ClickableMovementMethod getInstance() {
if (sInstance == null) {
sInstance = new ClickableMovementMethod();
}
return sInstance;
}
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
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);
ClickableImageSpan[] imageSpans = buffer.getSpans(off, off, ClickableImageSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
} else if (imageSpans.length != 0) {
if (action == MotionEvent.ACTION_UP) {
imageSpans[0].onClick(widget);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(imageSpans[0]),
buffer.getSpanEnd(imageSpans[0]));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return false;
}
}
以上2个类 在文章开头 http://www.cnblogs.com/luction/p/3645210.html 解释的很清楚,在这里我就不多描述了
最后附带上SpannableString 对象 常用的一些功能
设置超链接
sp.setSpan(new URLSpan(“http://baidu.com”), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置下划线 sp.setSpan(new UnderlineSpan(), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);