今天公司要求一个TextView中有不同的文字颜色
,比如说:一二三四五一二三四五一二三四五一二三四五,要求一是黄色二是绿色三是红色其他均是黑色.(哈哈只是个例子别认真)^_^
针对这样的问题,洒家真的是脑袋疼,因为以前会写多个TextView来设置不同的颜色,然后在组合嘛,现在觉得这个办法简直Low不过,当时确实解决了问题.
现在突然这样要求之后发现,再去创建不同TextView不仅资源浪费而且还能活活把人累死,偶然想起一次公司配合html写的TextView文字变色突发奇想,写了一个自定义控件,因为是临时写的又怕下了班懒,不写博客.特此记下.这个控件不仅完成了支持一个TextView可以改变某一个关键词的颜色,还支持一个TextView可以有多个关键字且关键字颜色不同.
先看两张效果图吧
那么废话不多说,给大家共享我的源码,写的菜的地方也希望大神指出来,共同进步~~
/**
* Created by wanghan on 2016/11/2.
*/
public class PartColorTextView extends TextView {
private final String SRM="%1$s";//文字转换Hmtl的格式固定不要动
private final String OF="⊙";//替换颜色的字符
public PartColorTextView(Context context) {
super(context);
}
public PartColorTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PartColorTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
*@author WangHan
*创建时间:2016/11/2 14:38
*方法名:setPartText
*描述: 給文字顏色設置
*参数:allText:全部文字 keyText:变色关键字 otherTextColor:默认文字颜色 keyTextColor:要变颜色的字的颜色必须是个Color(getRe.getColor.)这样获得
*返回值:
*特殊注释:该方法适合只有一个关键词的时候
*/
public void setPartText(String allText,String keyText,int otherTextColor,int keyTextColor)
{
String NF = String.format("#%06X", 0xFFFFFF & keyTextColor);
String replace = SRM.replace(OF, NF);
String format = String.format(replace, keyText);
try {
String textStr = allText.replaceAll(keyText, format);
Spanned spanned = Html.fromHtml(textStr);
setTextColor(otherTextColor);
setText(spanned);
}catch (PatternSyntaxException e)
{
e.printStackTrace();
}
}
/**
*@author WangHan
*创建时间:2016/11/2 14:38
*方法名:setPartText
*描述: 給文字顏色設置
*参数:allText:全部文字 keyColorMap:用于一段话有多个,且颜色要求不同的集合,Key是关键字,Value是Color keyTextColor:要变颜色的字的颜色必须是个Color(getRe.getColor.)这样获得
*返回值:
*特殊注释:该方法适合一段话有多个关键词的时候
*/
public void setPartText(String allText,HashMap keyColorMap,int otherTextColor)
{
Spanned spanned = null;
String textStr=null;
Set keySet = keyColorMap.keySet();
for (String s : keySet) {
String NF = String.format("#%06X", 0xFFFFFF & keyColorMap.get(s));
String replace = SRM.replace(OF, NF);
String format = String.format(replace, s);
try {
if (textStr==null)
{
textStr = allText.replaceAll(s, format);
}else
{
textStr=textStr.replaceAll(s, format);
}
}catch (PatternSyntaxException e)
{
e.printStackTrace();
}
}
setTextColor(otherTextColor);
spanned= Html.fromHtml(textStr);
setText(spanned);
}
}
public class MainActivity extends AppCompatActivity {
private PartColorTextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (PartColorTextView) findViewById(R.id.main_tv);
String allll="一二三四五一二三四五一二三四五";
tv1.setPartText(allll,"二",Color.BLACK,getResources().getColor(R.color.colorAccent));//单个关键词参数:全部文本,关键字文本,全部文本颜色,关键字文本颜色
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (PartColorTextView) findViewById(R.id.main_tv);
String allll="1. 关闭Autotuning(自动调整)\n" +
" 禁用这个可以帮助dns查找和网络发现。禁用方法和vista差不多。\n" +
" admin权限下在命令提示符里打:\n" +
" Netsh interface tcp set global autotuning=disabled\n" +
" 然后应该会显示OK。要检查执行结果的话,再输入\n" +
" Netsh interface tcp show global\n" +
" (应该是第五行)可以看到recieve window auto-tuning level的对应项是disabled就是了。\n" +
" 这个方法对vista也有提速效果。";
HashMap keysColor = new HashMap<>();//参数之一:key:关键字 Value:颜色 但一定是Color(int)的.如果是#ffffff这样的话建议还是写在color资源包中,个人习惯.
keysColor.put("Autotuning", Color.GREEN);
keysColor.put("Netsh",Color.RED);
keysColor.put("OK",Color.BLUE);
keysColor.put("禁用",Color.GRAY);
keysColor.put("dns",Color.CYAN);
tv1.setPartText(allll,keysColor,Color.BLACK);//多关键词多颜色
}