美文网首页Android开发Android 技术开发
自定义TextView支持字符串中指定字体的颜色 大小 样式

自定义TextView支持字符串中指定字体的颜色 大小 样式

作者: 赫丹 | 来源:发表于2016-11-03 17:25 被阅读1363次

    先看效果

    图像 4.png

    自定义属性简介

     颜色 :"#3bb64d"
     字体大小(sp):"20"
     字体下划线/删除线:"undeline/deleteline"
    字体属性正常/加粗/倾斜/倾斜加粗:"normal/bold/italic/bold_italic”
    

    傻瓜式使用方法

    xml

    <com.~~~~~~~.ColorFontTextView (单个颜色属性,null为不设置属性)   
    android:layout_width="match_parent"    
    android:layout_height="wrap_content"    
    android:gravity="center"    
    android:textColor="#252c3d"    
    android:textSize="12sp"    
    app:text_arrays="人|何事|画"    
    app:style_arrays="bold|italic|bold_italic"
    android:text="人生若只如初见,何事秋风悲画扇。" />
    
    <com.~~~~~~~.ColorFontTextView   (多个属性,null为不设置属性) 
    android:layout_width="match_parent"    
    android:layout_height="wrap_content"    
    android:gravity="center"    
    android:textColor="#252c3d"    
    android:textSize="12sp"    
    app:text_arrays="人|何事|画"    
    app:style_arrays="bold|italic|bold_italic"
    app:textsize_arrays="20|35|null"
    app:color_arrays="#fa5645|#3bb64d|#bd0a0a"
    app:line_arrays="undeline|null|deleteline"
    android:text="人生若只如初见,何事秋风悲画扇。" />
    
    <com.~~~~~~.ColorFontTextView    (java代码中使用)
    android:id="@+id/tv"    
    android:layout_width="match_parent"    
    android:layout_height="wrap_content"    
    android:gravity="center"    
    android:textColor="#252c3d"    
    android:textSize="10sp"  />
    

    Java代码中使用方法

    参数1:要展示的字符串;参数2:指定要设置属性的字符;参数3:设置的相关参数(字体/颜色/属性)
    ((ColorFontTextView)findViewById(R.id.tv)).setTextStyle("Often hate  not as good as anyone","hate|not|anyone","20|null|35")(null为not不指定字体大小)
    .setTextStyle("#fa5645|#3bb64d|#bd0a0a")(设置颜色)
    .setTextStyle("bold|italic|bold_italic");(设置属性)
    
    单个字符串设置属性
    ((ColorFontTextView)findViewById(R.id.tv)).setTextStyle("hello world","hello world","#3bb64d")
    .setTextStyle("40")
    .setTextStyle("deleteline")
    .setTextStyle("undeline")
    .setTextStyle("bold_italic");
    

    ColorFontTextView.java

    public class ColorFontTextView extends AppCompatTextView {
    private ArrayList<String> mTexts = new ArrayList<>();    
    private ArrayList<String> mColors = new ArrayList<>();    
    private ArrayList<String> mTextSizes = new ArrayList<>();    
    private ArrayList<String> mLines = new ArrayList<>();    
    private ArrayList<String> mStyles = new ArrayList<>();    
    private String mCurrentText;    
    private Context mContext;    
    private String styledTextString;    
    private String styleTexts;    
    public ColorFontTextView(Context context) {        
              super(context);        
              this.mContext = context;   
     }    
    public ColorFontTextView(ontext context, AttributeSet attrs) {        
              super(context, attrs);        
              this.mContext = context;        
              init(attrs);    
    }    
    public ColorFontTextView(Context context, AttributeSet attrs, int defStyleAttr) {        
              super(context, attrs, defStyleAttr);        
              this.mContext = context;        
              init(attrs);    
    }    
    //获得我们所定义的自定义样式属性   
    private void init(AttributeSet attrs) {        
              TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ColorFountTextView);       
             String colors =typedArray.getString(R.styleable.ColorFountTextView_color_arrays);        
              String texts = typedArray.getString(R.styleable.ColorFountTextView_text_arrays);        
              String textsizes = typedArray.getString(R.styleable.ColorFountTextView_textsize_arrays);        
              String lines = typedArray.getString(R.styleable.ColorFountTextView_line_arrays);        
              String styles = typedArray.getString(R.styleable.ColorFountTextView_style_arrays);       
              typedArray.recycle();        
              initDate(getText().toString(), colors, texts, textsizes, lines, styles);        
              setTextDate();    
    }    
    //截取字符串添加到对应的集合 
    private void initDate(String str, String colors, String texts, String textsizes, String lines, String styles) {       
     try {
     if (!TextUtils.isEmpty(texts)) {                
               String[] split = texts.split("\\|");                
               for (int i = 0; i < split.length; i++) {                    
               mTexts.add(split[i]);                      }            
    }           
     if (!TextUtils.isEmpty(colors)) {                
                String[] split = colors.split("\\|");                
                for (int i = 0; i < split.length; i++) {                   
                 mColors.add(split[i]);                }            
    }            
    if (!TextUtils.isEmpty(textsizes)) {                
                String[] split = textsizes.split("\\|");                
                for (int i = 0; i < split.length; i++) {                    
                mTextSizes.add(split[i]);                }            
    }           
     if (!TextUtils.isEmpty(lines)) {                
                String[] split = lines.split("\\|");                
                for (int i = 0; i < split.length; i++) {                    
                mLines.add(split[i]);                }            
    }           
     if (!TextUtils.isEmpty(styles)) {                
                String[] split = styles.split("\\|");                
                for (int i = 0; i < split.length; i++) {                    
                mStyles.add(split[i]);                }           
     }            
                mCurrentText = str;        
    } catch (Exception e) {            
                e.printStackTrace();        
    }    
    }    
    /**     * 根据相关属性赋值     */    
    private void setTextDate() {       
    try {       
     if (!TextUtils.isEmpty(mCurrentText)) {            
              SpannableString styledText = new SpannableString(mCurrentText);           
               if (mTextSizes != null && mTextSizes.size() != 0) {                
                int currentSize = mTextSizes.size() <=mTexts.size() ? mTextSizes.size() : mTexts.size();                
                for (int i = 0; i < currentSize; i++) {                    
                String size = mTexts.get(i);                    
                int startPostion = mCurrentText.indexOf(size);                    
                int endPostion = mCurrentText.indexOf(size) + size.length();                    
                if (!mTextSizes.get(i).contains("null")) {                        
    styledText.setSpan(new AbsoluteSizeSpan(sp2px(mContext, Integer.valueOf(mTextSizes.get(i)))), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                    }                }            
    }           
     if (mColors != null && mColors.size() != 0) {               
                 int currentSize = mColors.size() <= mTexts.size() ? mColors.size():mTexts.size() ;                
                for (int i = 0; i < currentSize; i++) {                    
                String size = mTexts.get(i);                    
               int startPostion = mCurrentText.indexOf(size);                    
              int endPostion = mCurrentText.indexOf(size) + size.length();                   
               if (!mColors.get(i).contains("null")) {                        
    styledText.setSpan(new ForegroundColorSpan(Color.parseColor(mColors.get(i))), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                    }                }            
    }            
    if (mLines != null && mLines.size() != 0) {               
               int currentSize = mLines.size() <= mTexts.size() ? mLines.size() : mTexts.size();                
              for (int i = 0; i < currentSize; i++) {                    
              String size = mTexts.get(i);                    
              int startPostion = mCurrentText.indexOf(size);                    
              int endPostion = mCurrentText.indexOf(size) + size.length();                    
    if (!mLines.get(i).contains("null")) {                        
              if (mLines.get(i).contains("undeline")) {                            
              styledText.setSpan(new UnderlineSpan(), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                        
    } else if (mLines.get(i).contains("deleteline")) {                            
              styledText.setSpan(new StrikethroughSpan(), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                        
    } else {                            
              styledText.setSpan(new UnderlineSpan(), startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                        }
                        } 
                   }            
    }            
    if (mStyles != null && mStyles.size() != 0) {                
              int currentSize = mStyles.size()<=mTexts.size() ?mStyles.size(): mTexts.size();                
              for (int i = 0; i < currentSize; i++) {                    
              String size = mTexts.get(i);                    
              int startPostion = mCurrentText.indexOf(size);                    
              int endPostion = mCurrentText.indexOf(size) + size.length();                    
    if (!mStyles.get(i).contains("null")) {                        
              StyleSpan styleSpan;                        
    if (("normal").equals(mStyles.get(i))) {                           
              styleSpan = new StyleSpan(Typeface.NORMAL);                        
    } else if (("bold").equals(mStyles.get(i))) {                           
              styleSpan = new StyleSpan(android.graphics.Typeface.BOLD);                        
    } else if (("italic").equals(mStyles.get(i))) {                            
              styleSpan = new StyleSpan(android.graphics.Typeface.ITALIC);                        
    } else if (("bold_italic").equals(mStyles.get(i))) {                            
              styleSpan = new StyleSpan(android.graphics.Typeface.BOLD_ITALIC);                       
     } else {                            
              styleSpan = new StyleSpan(Typeface.NORMAL);                       
     }                        
              styledText.setSpan(styleSpan, startPostion, endPostion, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                   
     } 
                }
                }           
             setText(styledText);            
            styledTextString=getText().toString();        }        
    }catch (Exception e){
                e.printStackTrace();        }   
     }    
    
    public ColorFontTextView  setTextStyle(String str,String texts,String all){        if(!TextUtils.isEmpty(all)&&!TextUtils.isEmpty(texts)){            
              styleTexts=texts;            
              String[] split = all.split("\\|");            
    if(all.contains("#")){                
              initDate(str, all, texts,null, null, null);            
    }else if(all.contains("undeline")||all.contains("deleteline")){                
              initDate(str,null,texts,null,all, null);            
    }else if(all.contains("normal")||all.contains("bold")||all.contains("italic")||all.contains("bold_italic")){                
              initDate(str, null, texts, null, null, all);           
    }else if(isNumeric(all)){                
              initDate(str, null, texts, all, null, null);            
    }else{                
              initDate(str, null, texts, null, null, null);            
    }            
              setTextDate();        
    }else{            
              setText(str);        
    }        
    return this;
        }    
    public ColorFontTextView setTextStyle(String all){        
    if(!TextUtils.isEmpty(styledTextString)&&!TextUtils.isEmpty(styleTexts)){            
              setTextStyle(styledTextString,styleTexts,all);        }        
              return this;    
    }    
    
    /**     * 将sp值转换为px值,保证文字大小不变         */    
    public static int sp2px(Context context, int spValue) {       
               float fontScale = context.getResources().getDisplayMetrics().scaledDensity;       
               return (int) (spValue * fontScale + 0.5f);    }    
    
    /**     * 判断字符串是是数字     */    
    public boolean isNumeric(String str){        
              Pattern pattern = Pattern.compile("[0-9]*");        
              Matcher isNum = pattern.matcher(str.replace("|",""));        
              if( !isNum.matches() ){            
              return false;        }        
              return true;    }}
    

    attr.xml

    <declare-styleable name="ColorFountTextView">    
    <attr name="text_arrays" format="string"/>    
    <attr name="color_arrays" format="string"/>    
    <attr name="textsize_arrays" format="string"/>    
    <attr name="line_arrays" format="string"/>    
    <attr name="style_arrays" format="string"/>
    </declare-styleable>
    

    以上为全部代码

    相关文章

      网友评论

        本文标题:自定义TextView支持字符串中指定字体的颜色 大小 样式

        本文链接:https://www.haomeiwen.com/subject/hoxiuttx.html