java - 使用 ReplacementSpan 时 getmeasuredheight 返回 0 或相同
问题描述
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
真机是三星Galaxy Note 9
更新:我有一些新发现,即使在虚拟设备上,如果你使用API27,也会有问题,API28没问题,真机API是28
解决方案
通过查看TextLine.java源码,因为ReplacementSpan继承自MetricAffectingSpan,而Text是在处理MetricAffectingSpan再处理CharactorStyle的过程中处理的,而当MetricAffectingSpan为ReplacementSpan时,则直接绘制继续,下面的CharactorStyle就没有了完全处理
推荐阅读
- node.js - Express.js 应用程序错误:尝试访问某些路由时浏览器卡在加载状态
- python - Jetbrains Pycharm 2019.2 & Win10 WSL:无法同步实际的 python 包
- awk - 将“u”转换为“t”而不更改 FASTA 中的标题
- php - 错误代码:“PP_E_RPS_CERT_NOT_FOUND”。消息:'内部错误:spRPSTicket->ProcessToken 失败
- mlflow - 如何在 mlflow 中添加更多表?
- node.js - Sequlize Postgres id 自动增量不起作用
- python - 使用主键比较 excel 文件并在新数据框中显示差异
- jenkins - 来自 SCM 和 @script/@tmp 项目的 Jenkinsfile
- r - 如何删除数据框中持续 6 小时或更长时间的所有负面事件,R
- javascript - 在 Vue.js 中,如何从 ThingSpeak API 检索 json 数据并在 Google 地图中使用坐标?