我正在尝试使用一个简单的SpannableStringon TextView,基于我发现的UnderDotSpan类(这里).
原始的UnderDotSpan只在文本本身下方放置一个特定大小和颜色的点(不重叠).我正在尝试的是首先正常使用它,然后使用自定义的drawable而不是dot.
与正常的跨度使用相反,这个只是没有显示任何东西.甚至没有文字.
以下是正常跨度的完成方式:
val text = "1"
val timeSpannable = SpannableString(text)
timeSpannable.setSpan(ForegroundColorSpan(0xff00ff00.toInt()), 0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.setText(timeSpannable);
Run Code Online (Sandbox Code Playgroud)
它将在TextView中显示绿色"1".
但是当我尝试下一个spannable时,它(整个TextView内容:文本和点)根本不显示:
val text = "1"
val spannable = SpannableString(text)
spannable.setSpan(UnderDotSpan(this@MainActivity, 0xFF039BE5.toInt(), textView.currentTextColor),
0, text.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
textView.setText(spannable, TextView.BufferType.SPANNABLE)
// this also didn't work: textView.setText(spannable)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,在我使用的一个项目中,它在RecyclerView中运行良好,而在另一个项目中,它没有.
这是UnderDotSpan的代码:
class UnderDotSpan(private val mDotSize: Float, private val mDotColor: Int, private val mTextColor: Int) : ReplacementSpan() {
companion object {
@JvmStatic
private val DEFAULT_DOT_SIZE_IN_DP = 4
}
constructor(context: Context, dotColor: …Run Code Online (Sandbox Code Playgroud) 我目前正致力于渲染Bitmap,然后我想将其发送到移动打印机.但是,我正在努力测量文本的高度,所以我可以适当地提升y位置.
我的基本位图/画布/绘画配置是这样的(字体大小是16,位图的尺寸是200x400(宽x高)):
public MyRenderer() {
// Initialize bitmap
bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888);
// Initialize canvas
canvas = new Canvas(bitmap);
// Initialize brush (Paint instance)
brush = new Paint();
brush.setTextSize(16);
brush.setTypeface(Typeface.SANS_SERIF);
brush.setColor(Color.BLACK);
brush.setStyle(Paint.Style.FILL);
brush.setAntiAlias(true);
brush.setTextAlign(Align.LEFT);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,现在我想做的是:如果我使用Paint的方法drawText,我需要提供x和y坐标.至于x为零(假设左对齐文本)但是对于y,我必须计算我打印的每个文本的高度并将其加起来,这样我就可以跟踪我当前的y位置.
这是奇怪的地方:我使用以下方法来确定文本的高度(使用我先前初始化的Paint对象 - 它被称为"brush"):
public int measureHeight(String text) {
Rect result = new Rect();
// Measure the text rectangle to get the height
brush.getTextBounds(text, 0, text.length(), result);
return result.height();
}
Run Code Online (Sandbox Code Playgroud)
上述方法为以下文本返回以下值:
我知道如何将 Jetpack Compose 中的文本与基线对齐。
但现在我需要对齐两个不同大小的文本,这些文本Row通过这两种字体中较大的字体的上升来对齐。如果有意义的话,我想将此视为“按顶部基线”对齐两个文本。 Modifier.align(Alignment.Top)不起作用,因为它不会通过上升对齐,而是通过布局的顶部对齐,然后文本在顶部无法正确对齐。
我试图看看如何做到这一点,但显然没有现成的函数或修饰符?我什至没有找到在 Compose 中访问 Text 的 ascent 属性等的方法。所以不确定这怎么可能?
感谢您的任何提示!:)
编辑:这就是使用时的样子Alignment.Top。但我希望这两个文本在顶部对齐。
android android-jetpack-compose android-jetpack-compose-text
我有一个Android应用程序,根据Android设备的分辨率动态缩放文本.我已经在Android模拟器中的所有预定义分辨率上测试了此代码,我的代码运行正常.(这包括与HTC Desire和Motorola Droid相同的分辨率)
它也适用于我的HTC Wildfire.
以下是模拟器的一些屏幕截图:

但是......我在HTC Desire上尝试了这个,我收到了使用Motorola Droid的用户报告,这些字体没有正确缩放:

请注意它是如何切断文本的.
任何想法为什么这不适用于这些特定的设备?
我目前有一个函数可以根据文本的可用高度缩小文本...这样的事情:
public static float calculateHeight(FontMetrics fm) {
return Math.abs(fm.ascent) + fm.descent;
}
public static int determineTextSize(Typeface font, float allowableHeight) {
Paint p = new Paint();
p.setTypeface(font);
int size = (int) allowableHeight;
p.setTextSize(size);
float currentHeight = calculateHeight(p.getFontMetrics());
while (size!=0 && (currentHeight) > allowableHeight) {
p.setTextSize(size--);
currentHeight = calculateHeight(p.getFontMetrics());
}
if (size==0) {
System.out.print("Using Allowable Height!!");
return (int) allowableHeight;
}
System.out.print("Using size " + size);
return size;
}
Run Code Online (Sandbox Code Playgroud)
任何想法为什么只在几个设备上发生这种情况?以及如何解决它?还有其他字体指标,而不是我需要考虑的,我不知道吗?像Scale还是DPI?
谢谢.
Paint和之间有什么区别TextPaint?只能TextPaint在画布上绘制文字吗?
我最近一直在研究如何在画布上绘制文字,这导致了我TextPaint.但是,在阅读源代码时,我很惊讶地发现根本没有太多内容TextPaint.实际上,您实际上并不需要它在画布上绘制文本.所以我正在添加这个Q&A以使其更加清晰.
出于以下几个方法的文档Layout(包括StaticLayout,DynamicLayout,和BoringLayout)非常sparce。
getLineBaseline(int line)getLineDescent(int line)getLineAscent(int line)getLineBottom(int line)getLineTop(int line)这些方法返回的数字究竟是多少?它们是正常的字体度量值还是布局上的位置?
我做了一个测试项目来找出答案,所以我在问答风格下面发布了我的答案。
android ×6
fontmetrics ×2
paint ×2
android-jetpack-compose-text ×1
canvas ×1
java ×1
spannable ×1
spanned ×1
staticlayout ×1
text ×1
textview ×1