Android研发过程 经常会碰到这样的情况就是 一个textview 中 需要在特定的位置显示不同的颜色比如红色或者蓝色的高亮 最贱的办法就是一个linearlayout中放置多个textview 当然可以解决 为了组件的复用和封装 今天这里我们将使用自定义view和自定义属性来实现该效果!!!下面进入正题!
首先创建一个类 继承自TextView 复写其中三个参数的构造方法
然后开始定义属性了 部分字体高亮 需要三个参数 即从哪个位置开始到哪个位置的结束的字体高亮 高亮的颜色是什么
这样我们需要在value 中的 attrs .xml 中新建三个属性
分别表示字体高亮的其实位置和结束位置以及高亮的要颜色
既然自定义了属性和属性集就要使用 首先在使用的布局文件中引用属性集 啥叫属性集
每个xml文件的开头 都会有xmlns:android="http://schemas.android.com/apk/res/android" 这样的属性说明 这个就是表示在该XML文件了 我们引用了 android数据集 同样要引用我们自己定义的属性集也使用同样的方式不同的是需要将自己应用的报名替换掉res/android 中的 android xmlns:XXX=”http://schemas.android.com/apk/res/应用的完整包名“
这个完整的包名 最好去倒manifast中去找 XXX可以任意的起名字
接着当然是在xml里使用我们自定义的textView了 在自定义的texeview中
使用属性XXX:text_start="7"
XXX:text_end="9"
XXX:text_color="@color/achi_blue_bg"
和一般的属性一样使用即可 控件也引入了 属性集也引入了接下来该处理基本的高亮功能了
处理高亮等都是使用SpannableStringBuilder 类实现的 改类还有很多的效果可以使用
首先是获得自定义的属性
TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.MultiTextColor);
mStart = tArray.getInteger(R.styleable.MultiTextColor_text_start, 0);
mEnd = tArray.getInteger(R.styleable.MultiTextColor_text_end, 0);
mTextColor = tArray.getInteger(R.styleable.MultiTextColor_text_color, 0);
tArray.recycle();
在三个 参数的构造方法中 使用tpyearray来获得属性 获得后记得回收掉
属性获得了之后就可以使用 SpannableStringBuilder 来实现高亮了
if (this.getText().toString() != null)
mStyle = new SpannableStringBuilder(this.getText().toString());
if(mEnd<=this.getTextSize()){
mStyle.setSpan(new ForegroundColorSpan(mTextColor), mStart, mEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
this.setText(mStyle);
该方法就是实习了从start位置到end位置的高亮效果!
是不是很简单!!!!!
完整的代码如下
public class MuiltiColorTextView extends TextView {
private int mStart;
private int mEnd;
private int mTextColor;
private SpannableStringBuilder mStyle;
public MuiltiColorTextView(Context context) {
this(context, null);
}
public MuiltiColorTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MuiltiColorTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.MultiTextColor);
mStart = tArray.getInteger(R.styleable.MultiTextColor_text_start, 0);
mEnd = tArray.getInteger(R.styleable.MultiTextColor_text_end, 0);
mTextColor = tArray.getInteger(R.styleable.MultiTextColor_text_color, 0);
tArray.recycle();
setOtherTextColor();
}
private void setOtherTextColor() {
if (this.getText().toString() != null)
mStyle = new SpannableStringBuilder(this.getText().toString());
if(mEnd<=this.getTextSize()){
mStyle.setSpan(new ForegroundColorSpan(mTextColor), mStart, mEnd, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
}
this.setText(mStyle);
}
}