使用ReplacementSpan时,getmeasuredheight返回0或相同

时间:2019-03-06 04:34:12

标签: java android

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);
}}

MainActivity.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,并且如果调试是一台真正的机器,则getMeasuredHeight将仅返回0或相同的值,如果调试是虚拟设备,则getMeasuredHeight将返回正确的值。

但是,无论是真实计算机还是虚拟设备,getMeasuredWidth返回的值都是正确的。

这是构建环境: compileSdkVersion 27 minSdkVersion 15 targetSdkVersion 27

真正的机器是sangsumg Galaxy Note 9

更新: 我有一些新发现,即使在虚拟设备上,如果使用API​​27,也会有问题,API28没问题,真实机器的API是28

1 个答案:

答案 0 :(得分:0)

通过查看TextLine.java源代码,因为ReplacementSpan继承自MetricAffectingSpan,并且在处理MetricAffectingSpan然后处理CharactorStyle的过程中处理了Text,并且当MetricAffectingSpan是ReplacementSpan时,则直接绘制并继续执行以下操作完全不处理CharactorStyle