shadowSpan.java软件
public class ShadowSpan extends ReplacementSpan {
public ShadowSpan(int color, PointF offset){
}
@Override
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
return (int)paint.measureText(text,start,end);
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
canvas.drawText(text,start,end,x,y,paint);
}}
main活动.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String tx = "sssss3333";
SpannableString sp = new SpannableString(tx);
ShadowSpan ss = new ShadowSpan(Color.GRAY,new PointF(8,8));
AbsoluteSizeSpan as = new AbsoluteSizeSpan(100);
sp.setSpan(ss,0,tx.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
sp.setSpan(as,0,tx.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
TextView tv = new TextView(this);
tv.setText(sp, TextView.BufferType.SPANNABLE);
tv.measure(0,0);
int h = tv.getMeasuredHeight();
int w = tv.getMeasuredWidth();
FrameLayout fl = (FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content);
fl.addView(tv);
}}
上面是我所有的代码,非常简单,但是有一个非常奇怪的问题。
如果我使用replacementspan,并且调试是一台真正的机器,那么getmeasuredhight将只返回0或相同的值,如果调试是虚拟设备,那么getmeasuredhight将返回正确的值。
但是,无论是实机还是虚拟设备,getMeasuredWidth返回的值都是正确的。
这是生成环境:
编译DK版本27
明斯克版本15
目标版本27
真正的机器是Sangsumg Galaxy Note 9
更新:
我有一些新的发现,即使是在虚拟设备上,如果使用API27,也会有问题,API28没有问题,真正的机器API是28
最佳答案
通过查看textline.java源代码,因为replacementspan是从metricaffectingspan继承来的,文本是在处理metricaffectingspan然后处理characterstyle的过程中处理的,当metricaffectingspan是replacementspan时,直接绘制并继续,完全不处理以下characterStyle