是否可以更改单位Paint.setTextSize()?据我所知,它是像素,但我喜欢在DIP中设置文本大小以支持多屏幕.
我需要构建自己的自定义,TextView所以我一直在学习StaticLayout在画布上绘制文本.这比Canvas.drawText()直接使用更好,或者说文档说的.但是,文档没有给出任何示例.只有模糊的参考才能StaticLayout.Builder成为更新的方法.
我终于工作了,但是我在下面添加了我的解释.
我想画SpannedString一个Canvas.
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 1, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
Run Code Online (Sandbox Code Playgroud)
上面的例子是使用a绘制的TextView,而a又使用a Layout来绘制带有跨度的文本.我知道使用a Layout是向画布绘制文本的推荐方法.但是,我从头开始制作自己的文本布局,所以我需要自己实现.
做这样的事情是行不通的
canvas.drawText(spannableString, 0, spannableString.length(), 0, 0, mTextPaint);
Run Code Online (Sandbox Code Playgroud)
因为drawText只从中获取文本spannableString,而不是任何跨度.绘图颜色分别处理TextPaint.
如何使用canvas.drawText(或drawTextRun)绘制跨度信息(特别是前景和背景颜色)?
有关
计划解决方案
我打算直接做一个自我回答,但事实证明这比我想象的更难.所以我会先发帖,然后在我弄清楚的时候添加一个答案.(我当然欢迎任何人先回答.)
这是我到目前为止的作品:
drawTextRun绘制文本(例子)(更新:未添加至API 23)getRunAdvance测量从哪里开始的下一个文本运行( …