自定义TextView支持字符串中指定字体的颜色|自定义TextView支持字符串中指定字体的颜色 大小 样式
先看效果
文章图片
图像 4.png 自定义属性简介
颜色 :"#3bb64d"
字体大小(sp):"20"
字体下划线/删除线:"undeline/deleteline"
字体属性正常/加粗/倾斜/倾斜加粗:"normal/bold/italic/bold_italic”
傻瓜式使用方法
xml
Java代码中使用方法 参数1:要展示的字符串;参数2:指定要设置属性的字符;参数3:设置的相关参数(字体/颜色/属性)
((ColorFontTextView)findViewById(R.id.tv)).setTextStyle("Often hatenot 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 mTexts = new ArrayList<>();
private ArrayList mColors = new ArrayList<>();
private ArrayList mTextSizes = new ArrayList<>();
private ArrayList mLines = new ArrayList<>();
private ArrayList 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 ColorFontTextViewsetTextStyle(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
以上为全部代码
推荐阅读
- 批量操作数据、自定义分页器
- TextView极细字体
- NET6|NET6 IOptionsSnapshot 配合Apollo 实现动态配置 支持自定义解析
- uni-app|uni-app中使用自定义组件全局化.....
- notepad|notepad php代码提示,Notepad++ 配置 支持jquery、html、css、javascript、php代码提示
- #|java自定义工具类编写规范
- spring|Spring Boot项目下JPA自定义雪花算法ID生成器详解
- SpringBoot使用自定义注解+AOP+Redis实现接口限流
- nodejs|nodejs 支持 es6 & 自动重启
- 世界迷雾安卓版将从|世界迷雾安卓版将从 Nougat 开始支持