效果图

图片管理类
ublic class UserFaceManager {
private LinkedHashMap<String, Integer> uMap;
private static UserFaceManager ufm;
private UserFaceManager(){
init();
}
public static UserFaceManager getInstance(){
if (ufm==null){
ufm=new UserFaceManager();
}
return ufm;
}
private void init() {
uMap = new LinkedHashMap<>();
uMap.put("[show]", R.drawable.boq);
uMap.put("[manager]", R.drawable.bop);
uMap.put("[lv15]", R.drawable.fans_badge_with_level_15);
uMap.put("[lv15v]", R.drawable.fans_badge_with_level_15v);
uMap.put("[lv15vy]", R.drawable.fans_badge_with_level_15vy);
uMap.put("[lv24]", R.drawable.fans_badge_with_level_24);
uMap.put("[lv24v]", R.drawable.fans_badge_with_level_24v);
uMap.put("[lv24vy]", R.drawable.fans_badge_with_level_24vy);
uMap.put("[lv6]", R.drawable.fans_badge_with_level_6);
uMap.put("[lv6v]", R.drawable.fans_badge_with_level_6v);
uMap.put("[lv6vy]", R.drawable.fans_badge_with_level_6vy);
}
public int getValue(String key){
if (uMap.containsKey(key)){
int value = uMap.get(key);
return value;
}
return -1;
}
图片居中类
public class CenterAlignImageSpan extends ImageSpan {
public CenterAlignImageSpan(Drawable d) {
super(d);
}
public CenterAlignImageSpan(Drawable d, int verticalAlignment) {
super(d, verticalAlignment);
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,
@NonNull Paint paint) {
Drawable drawable = getDrawable();
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
//计算y方向的位移
int translationY = (y + fm.descent + y + fm.ascent) / 2 - drawable.getBounds().bottom / 2;
canvas.save();
//绘制图片位移一段距离
canvas.translate(x, translationY);
drawable.draw(canvas);
canvas.restore();
}
}
spannable工具类
public class SpannableUtils {
private volatile static SpannableUtils span;
//正则模板 表示任意字符
private Pattern pattern_img=Pattern.compile("\\[(\\S+?)\\]");
private Pattern pattern_text=Pattern.compile("(\\S+?)\\:");
private SpannableUtils(){
// init();
}
//// 初始化
// private void init() {
// sb = new StringBuffer();
// spannableUtils = SpannableUtils.getInstance();
//
// }
public static SpannableUtils getInstance(){
if (span==null){
span=new SpannableUtils();
}
return span;
}
public SpannableString setupMsgToSpanStr(UserInfo userInfo, TextView tv){
StringBuffer sb = new StringBuffer();
UserFaceManager userFaceManager = UserFaceManager.getInstance();
//获取用户信息
String msg= userInfo.getMsg();
String userLv = userInfo.getUserLv();
int userManager = userInfo.getUserManager();
String userName = userInfo.getUserName();
int userShow = userInfo.getUserShow();
//对信息判断 进行文本拼接
//如果是爷字辈
if (userShow==1&&userManager==0){
sb.append("[show]");
sb.append("["+userLv+"]");
sb.append(userName+":");
sb.append(msg);
SpannableString spannableString = setupVipUser(sb, userFaceManager, tv);
return spannableString;
//如果是管理员
}else if (userShow==0&&userManager==1){
sb.append("[manager]");
sb.append("["+userLv+"]");
sb.append(userName+":");
sb.append(msg);
SpannableString spannableString = setupVipUser(sb, userFaceManager, tv);
return spannableString;
//啥也不是
}else{
sb.append("["+userLv+"]");
sb.append(userName+":");
sb.append(msg);
SpannableString spannableString = setupNonmemberUser(sb, userFaceManager, tv);
return spannableString;
}
}
//会员用户设置
public SpannableString setupVipUser(StringBuffer sb,UserFaceManager userFaceManager,TextView tv){
//转拼接好的字符串
SpannableString spanS = SpannableString.valueOf(sb);
//正则查找[]
Matcher matcher = pattern_img.matcher(spanS);
// int imgClickFlag=0;
while (matcher.find()){
// imgClickFlag++;
String str = matcher.group(0);//第一个找到的[]
//用规则检测的结果的初始位置和结束位置
final int start = matcher.start();
int end = matcher.end();
if (end -start<10){
//获取图片管理器中的对应映射图片
int value = userFaceManager.getValue(str);
//转换成drawable
Drawable drawable = MyApp.context.getResources().getDrawable(value);
//设置图片的边界 左上右下的顺序
drawable.setBounds(0,0,drawable.getIntrinsicWidth()/2,drawable.getIntrinsicHeight()/2);
ImageSpan imageSpan = new CenterAlignImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
spanS.setSpan(imageSpan, start, end, SpannedString.SPAN_INCLUSIVE_INCLUSIVE);
if (str.contains("show")||str.contains("manager")){
spanS.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyApp.context, VipActivity.class);
MyApp.context.startActivity(intent);
}
}, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}else{
spanS.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyApp.context, VipActivity.class);
Toast.makeText(MyApp.context ,"充钱提升等级", Toast.LENGTH_SHORT).show();
}
}, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
//设置字体颜色
Matcher matcher1 = pattern_text.matcher(spanS);
while (matcher1.find()){
int start = matcher1.start();
int end = matcher1.end();
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#CC8287"));
spanS.setSpan(foregroundColorSpan, start,end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
spanS.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyApp.context, VipActivity.class);
Toast.makeText(MyApp.context, "点击名字", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
ForegroundColorSpan foregroundColorSpan1 = new ForegroundColorSpan(Color.parseColor("#F42C0D"));
spanS.setSpan(foregroundColorSpan1, end, spanS.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
return spanS;
}
//非会员用户设置
public SpannableString setupNonmemberUser(StringBuffer sb,UserFaceManager userFaceManager,TextView tv){
//转拼接好的字符串
SpannableString spanS = SpannableString.valueOf(sb);
//正则查找[]
Matcher matcher = pattern_img.matcher(spanS);
// int imgClickFlag=0;
while (matcher.find()){
// imgClickFlag++;
String str = matcher.group(0);//第一个找到的[]
final int start = matcher.start();
int end = matcher.end();
if (end -start<10){
int value = userFaceManager.getValue(str);
Drawable drawable = MyApp.context.getResources().getDrawable(value);
drawable.setBounds(0,0,drawable.getIntrinsicWidth()/2,drawable.getIntrinsicHeight()/2);
ImageSpan imageSpan = new CenterAlignImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
spanS.setSpan(imageSpan, start, end, SpannedString.SPAN_INCLUSIVE_INCLUSIVE);
if (str.contains("show")||str.contains("manager")){
spanS.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyApp.context, VipActivity.class);
MyApp.context.startActivity(intent);
}
}, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}else{
spanS.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyApp.context, VipActivity.class);
Toast.makeText(MyApp.context ,"充钱提升等级", Toast.LENGTH_SHORT).show();
}
}, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
//设置字体颜色
Matcher matcher1 = pattern_text.matcher(spanS);
while (matcher1.find()){
int start = matcher1.start();
int end = matcher1.end();
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0F3AEC"));
spanS.setSpan(foregroundColorSpan, start,end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
spanS.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MyApp.context, VipActivity.class);
Toast.makeText(MyApp.context, "点击名字", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//去掉字体下划线
ds.setUnderlineText(false);
//设置字体颜色 在设置监听后字体颜色会改变 所以要重新绘制一下
ds.setColor(Color.parseColor("#0F3AEC"));
}
}, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
ForegroundColorSpan foregroundColorSpan1 = new ForegroundColorSpan(Color.parseColor("#0C0C0C"));
spanS.setSpan(foregroundColorSpan1, end, spanS.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
return spanS;
}
}
适配器
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
private ArrayList<UserInfo> list;
private Context context;
private SpannableUtils su;
public MyAdapter(ArrayList<UserInfo> list, Context context, SpannableUtils su) {
this.list = list;
this.context = context;
this.su = su;
}
@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyHolder(LayoutInflater.from(context).inflate(R.layout.layout_item, parent,false));
}
@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
UserInfo userInfo = list.get(position);
String userLv = userInfo.getUserLv();//获取用户等级 查看是否是vip
// String[] lvs = userLv.split("lv");
String lv = userLv.replace("lv", "");
if (lv.contains("v")){
holder.ll.setBackgroundColor(Color.parseColor("#FCE3E1"));
}
SpannableString spannableString = su.setupMsgToSpanStr(userInfo,holder.tv);
holder.tv.setText(spannableString);
}
@Override
public int getItemCount() {
return list.size();
}
class MyHolder extends RecyclerView.ViewHolder{
TextView tv;
LinearLayout ll;
public MyHolder(@NonNull View itemView) {
super(itemView);
tv=itemView.findViewById(R.id.tv_spannable);
ll=itemView.findViewById(R.id.ll);
}
}
}
主界面
public class MainActivity extends AppCompatActivity {
private SpannableUtils spanU;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
RecyclerView recyc = findViewById(R.id.recyc);
spanU=SpannableUtils.getInstance();
ArrayList<UserInfo> list = new ArrayList<>();
list.add(new UserInfo("lv24v","我五哥全网第一",1,0,"狠人"));
list.add(new UserInfo("lv6","我五哥全网第一",0,0,"暴走大侠华山求带"));
list.add(new UserInfo("lv15vy","我五哥全网第一",0,1,"锦衣卫来个30万战斗力会走位的开车了"));
recyc.setLayoutManager(new LinearLayoutManager(this));
MyAdapter myAdapter = new MyAdapter(list, this, spanU);
recyc.setAdapter(myAdapter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(spanU!=null){
spanU=null;
}
}
}
自定bean类
public class UserInfo {
// private String uid;//用户id
private String userLv;//用户等级 lv+number+v+y nubmer等级 v是否是vip y是否是年会员
// private String userVip;//用户是否是vip 以及是否是年会员
private String userName;//用户名字
private int userShow;//用户特殊标识0代表没有 1代表有
private int userManager;//是否是管理员0代表不是 1代表是
private String msg;
public UserInfo( String userLv, String userName, int userShow, int userManager, String msg) {
// this.uid = uid;
this.userLv = userLv;
this.userName = userName;
this.userShow = userShow;
this.userManager = userManager;
this.msg = msg;
}
public String getUserLv() {
return userLv;
}
public void setUserLv(String userLv) {
this.userLv = userLv;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserShow() {
return userShow;
}
public void setUserShow(int userShow) {
this.userShow = userShow;
}
public int getUserManager() {
return userManager;
}
public void setUserManager(int userManager) {
this.userManager = userManager;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
xml也没什么 就是一个recyclerView 条目一个textview
网友评论