我正在尝试水平和垂直对齐位图中的文本,我读了几篇文章,但我找不到解决方案.位图是一个简单的圆形图像.我发布了当前的代码.它或多或少都有效,但是文本没有完全居中,它看起来有点在左边,有点在顶部,我的意思是我似乎必须添加一个偏移来将它移动到右边和底部.
public static float convertDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return px;
}
v = (ImageView) findViewById(R.id.imageView1);
Bitmap b = BitmapFactory.decodeResource(getResources(),
R.drawable.marker).copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(b);
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setARGB(255, 0, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
textPaint.setTextSize(convertDpToPixel(9, this));
String text = "30";
int xPos = (canvas.getWidth() / 2);
int yPos = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() +
textPaint.ascent()) / 2)) ; …Run Code Online (Sandbox Code Playgroud) 大家好:我正在编写一个继承自TextView的类,并覆盖其onDraw()方法,但在该方法中,我的调用canvas.drawText()似乎不起作用,代码如下所示:
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(android.graphics.Color.WHITE);
paint.setTextSize(20);
String text = "hello";
canvas.drawText(text, 0, 0, paint);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Jetpack Compose 中的圆圈内绘制文本。
我画了一个圆,中心是画布的中心。
现在我想精确地在圆的中心绘制文本。
drawTextJetpack compose中的函数具有canvas参数topLeft,该参数需要Offset包含文本的矩形的左上角。我知道我不能通过圆心作为偏移量topLeft,如果我这样做,结果将如下所示,这不是我想要的。
我希望文本恰好绘制在圆的中心。
这是代码:
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.Green.copy(alpha = 0.2f))
.padding(36.dp),
contentAlignment = Alignment.Center
) {
val textMeasurer = rememberTextMeasurer()
val textToDraw = "A"
Canvas(modifier = Modifier.fillMaxSize()) {
drawCircle(
center = Offset(
x = center.x,
y = center.y
),
radius = 350f,
color = Color.Blue,
style = Stroke(
width = 8f
)
)
drawText(
textMeasurer = textMeasurer,
text = textToDraw,
style = TextStyle( …Run Code Online (Sandbox Code Playgroud) android drawtext android-canvas android-jetpack-compose android-jetpack-compose-canvas
我无法在Canvas中实现平滑非常慢的文本动画,因为Canvas.drawText不想在"像素之间"绘制.例如,给定4个连续帧,其中我绘制Y偏移为0,0.5,1,1.5的文本,画布实际上将分别在偏移0,0,1,1处绘制它,这导致动画"生涩".有一个标志Paint.SUBPIXEL_TEXT_FLAG,它应该保持浮动精度.
我发现了一个相关的线程,其中Romain Guy说Android中目前不支持这个标志:Android 中一些Paint常量的含义.
我的问题是:有任何现有的解决方法吗?
注意:在另一个位图中绘制一次文本,然后使用浮动偏移绘制此位图而不是绘制文本似乎也不起作用.
我的应用程序面临严重问题,在Google Play上发布,并且除了> 4.0之外,显然在所有Android版本上都能正常运行.
这是我的Android 4.0 HTC手机的截图:

这就是我在Nexus 7,Android 4.2.1(模拟器中的相同行为)上得到的结果:

我看到每个使用的文本都有相同的行为 canvas.drawText()
用于绘制文本的Paint是:
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(color); //some color
paint.setTextSize(size); //some size
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
paint.setTextAlign(Align.CENTER);
Run Code Online (Sandbox Code Playgroud)
在logCat(4.2.1模拟器)中,我看到了很多
12-18 20:42:21.096: W/Trace(276): Unexpected value from nativeGetEnabledTags: 0
Run Code Online (Sandbox Code Playgroud)
我在清单中使用这些设置:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8" />
Run Code Online (Sandbox Code Playgroud) layout user-interface android drawtext android-4.2-jelly-bean
是否可以将Html传递给Canvas.drawtext().
我试过这个:
canvas.drawText(Html.fromHtml("This is an <u>underline</u> text demo for TextView."), 0, 20, colIndex, rowIndex, getTextPaint());
Run Code Online (Sandbox Code Playgroud)
但是这不能解析标签而不能正确显示.
提前致谢.
我想在图像上绘制文本。我使用此代码,但是在图像上看不到任何文本。
void ImageSaver::save(const QString &path) const {
QImage image(img_);
QPainter p(&image);
p.setPen(QPen(Qt::red));
p.setFont(QFont("Times", 12, QFont::Bold));
p.drawText(image.rect(), Qt::AlignCenter, "Text");
image.save(path);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Layer DrawText进行绘制FormattedText.现在我使用下面的代码来定义格式化的文本,我可以设置TextAlignment为Center.但是VerticalAlignment呢?如下图所示,文本中心不在中心点,此处显示红点.
我正在定义的部分FormattedText:
var ft = new FormattedText("A",
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Verdana"),
36, Brushes.Yellow);
ft.TextAlignment = TextAlignment.Center;
Run Code Online (Sandbox Code Playgroud)
我正在绘制文本的部分:
var centerpoint = new Point(0,0);
dc.DrawText(ft, centerpoint);
Run Code Online (Sandbox Code Playgroud)
这是最终结果:

我希望文本的中间位于圆圈的中心.
我想画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测量从哪里开始的下一个文本运行( …嗨,我有一个 20 秒长的视频,我想从 00:00:10 秒到 00:00:15 秒向该视频添加一些文本,其中仅显示“夏季视频”并使用 FFMPEG 淡入淡出。
我知道我必须使用 drawtext 过滤器,但有人有任何例子吗?
谢谢你。