相关疑难解决方法(0)

为什么我的spannable没有显示?

背景

我正在尝试使用一个简单的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)

android textview spanned spannable

9
推荐指数
1
解决办法
892
查看次数

Android:在画布上测量文本高度

我目前正致力于渲染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)

上述方法为以下文本返回以下值:

  1. " Hello World "返回12的高度
  2. " 相机实例可用于计算3D变换并生成矩阵. "返回高度为16
  3. " Android设计简介:了解创建世界级Android用户界面的原则,构建模块和模式的地方.无论您是UI专业人士还是扮演该角色的开发人员,这些文档都会向您展示如何做出良好的设计决策,无论大小. "返回 …

android paint android-canvas

8
推荐指数
2
解决办法
1万
查看次数

在 Jetpack Compose 中通过字体的上升而不是基线对齐两个文本

我知道如何将 Jetpack Compose 中的文本与基线对齐。

但现在我需要对齐两个不同大小的文本,这些文本Row通过这两种字体中较大的字体的上升来对齐。如果有意义的话,我想将此视为“按顶部基线”对齐两个文本。 Modifier.align(Alignment.Top)不起作用,因为它不会通过上升对齐,而是通过布局的顶部对齐,然后文本在顶部无法正确对齐。

我试图看看如何做到这一点,但显然没有现成的函数或修饰符?我什至没有找到在 Compose 中访问 Text 的 ascent 属性等的方法。所以不确定这怎么可能?

感谢您的任何提示!:)

编辑:这就是使用时的样子Alignment.Top。但我希望这两个文本在顶部对齐。

在此输入图像描述

android android-jetpack-compose android-jetpack-compose-text

7
推荐指数
1
解决办法
1798
查看次数

在Android设备上运行时,FontMetrics不正确.模拟器很好

我有一个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?

谢谢.

java android fontmetrics

4
推荐指数
1
解决办法
3806
查看次数

Android中的Paint和TextPaint有什么区别?

Paint和之间有什么区别TextPaint?只能TextPaint在画布上绘制文字吗?

我最近一直在研究如何在画布上绘制文字,这导致了我TextPaint.但是,在阅读源代码时,我很惊讶地发现根本没有太多内容TextPaint.实际上,您实际上并不需要它在画布上绘制文本.所以我正在添加这个Q&A以使其更加清晰.

android text canvas paint

4
推荐指数
1
解决办法
3506
查看次数

Android Layout:getLineBaseline、getLineDescent、getLineAscent、getLineBottom、getLineTop的含义

出于以下几个方法的文档Layout(包括StaticLayoutDynamicLayout,和BoringLayout)非常sparce。

这些方法返回的数字究竟是多少?它们是正常的字体度量值还是布局上的位置?

我做了一个测试项目来找出答案,所以我在问答风格下面发布了我的答案。

android fontmetrics staticlayout dynamiclayout

1
推荐指数
1
解决办法
771
查看次数