先看图
今天碰到这个需求:小数点后如果是一位数字,则小数点前面数字方法,如果两位,则两位方法,如果三位,则最后一位缩小上为移,如果四位,则最后两位放大,如果五位置,和三位一样处理,一开始想用多个textview拼接实现,后面觉得太麻烦,因为服务器给回来的数据就是一大串,你要先进行format再一个个取位数?后面我看了下有人说用textview.settext(html.fromhtml(“sb“));来处理,但是问题是具体大小你怎么解决?恰好网页前端在我旁边,我就问他能不能这样搞,他说要搞一些css样式貌似不好办,但是ios可以办,最后我找到了这个资料,通过span进行处理,具体参考:https://www.cnblogs.com/qynprime/p/8026672.html
下面写下我自己的处理:
//right
SpannableString spannableString = new SpannableString(priceNumber);
RelativeSizeSpan bigSizeSpan = new RelativeSizeSpan(1.6f);
RelativeSizeSpan smallSizeSpan = new RelativeSizeSpan(0.8f);
SuperscriptSpan superSpan = new SuperscriptSpan();
superSpan.updateMeasureState(new TextPaint());
superSpan.updateDrawState(new TextPaint());
spannableString.setSpan(bigSizeSpan,priceNumber.indexOf(".")+1, priceNumber.indexOf(".")+price+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );
spannableString.setSpan(smallSizeSpan, length-1, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );
spannableString.setSpan(superSpan,length-1,length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvPercentPrice.setText(spannableString);
//left
SpannableString spannableString2 = new SpannableString(buyPriceNumber);
RelativeSizeSpan bigSizeSpan2 = new RelativeSizeSpan(1.6f);
RelativeSizeSpan smallSizeSpan2 = new RelativeSizeSpan(0.8f);
SuperscriptSpan superSpan2 = new SuperscriptSpan();
superSpan.updateMeasureState(new TextPaint());
superSpan.updateDrawState(new TextPaint());
spannableString2.setSpan(bigSizeSpan2, buyPriceNumber.indexOf(".")+1, buyPriceNumber.indexOf(".")+price+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );
spannableString2.setSpan(smallSizeSpan2, length-1, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );
spannableString2.setSpan(superSpan2,length-1,length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
icon_price.setText(spannableString2);
其中SuperscriptSpan 就是上移的样式,RelativeSizeSpan 就是可以设置大小倍数,两者一起用即可,注意这些下表都是从0开始数