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);
    }


}






更多相关文章

  1. Android应用设计提示:关于资源对象
  2. Android(安卓)强弱指针分析
  3. Android(安卓)UI设计系列之自定义TextView属性实现带下划线的文
  4. 智能指针
  5. Android绘制(三):Path结合属性动画, 让图标动起来!
  6. Android视图控件属性layout_weight的作用
  7. resources的使用
  8. Android绘图机制(一)——自定义View的基础属性和方法
  9. android字体样式

随机推荐

  1. GUI实战|Python做一个文档图片提取软件
  2. 用Python爬取b站弹幕,看大家还会接受《爱
  3. 动态加密?看我如何见招拆招爬取某点评全站
  4. 收藏这些API,获取网易云音乐数据超轻松
  5. Fabric 源码学习:如何实现批量管理远程服
  6. 只要两步,用Python将地址标记在地图上!
  7. Ansible 之 通过yum模块安装软件
  8. 如何面对人生中的逆境?
  9. 火了!开源的Python抢票神器,过年回家就看这
  10. 圣诞节,教你用Python给微信头像添加一个圣