【发布时间】:2017-12-18 01:04:10
【问题描述】:
我需要在画布上绘制一些文本。我已经在画布中添加了一个矩形框,我的目标是使该文本适合该框,但无论我尝试什么,文本都无法完美地适合所有屏幕尺寸。
另一件事是该文本是简单的 HTML。
TextView currDateLabel = new TextView(getContext());
currDateLabel.layout(0, 0, boxSize.x, boxSize.y);
currDateLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.label_date));
currDateLabel.setTextColor(Color.WHITE);
currDateLabel.setText(Html.fromHtml("Dec 11<sup><small><small>TH</small></small></sup>"));
currDateLabel.setDrawingCacheEnabled(true);
Bitmap dateBitmap = currDateLabel.getDrawingCache(true);
// I've also tried setting the width of this Bitmap but it doesn't seem to do anything
this.canvas.drawBitmap(dateBitmap, boxPosition.x, boxPosition.y, null);
所以在这里解释一些变量:
boxSize是一个Point对象,用于存储画布上框的宽度和高度。 这些值似乎对TextView的大小没有影响,因为我可以看到文本超出了框。boxPosition是一个Point对象,它存储了画布上框的x和y位置。R.dimen.label_date是dimens.xml文件中的一个值。
我创建了多个dimens.xml 文件(values/dimens.xml、values-hdpi/dimens.xml、values-xhdpi/dimens.xml 等)
我认为我可以测试大多数屏幕尺寸并计算出每个屏幕类别的文本大小。但是它并没有按我的预期工作。
这些值适用于Samsung Galaxy S8:
屏幕宽度:1440,屏幕高度:2768
屏幕密度:4.0
屏幕密度 DPI:640
屏幕缩放密度:4.0
这些值适用于Samsung Galaxy S7:
屏幕宽度:1440,屏幕高度:2560
屏幕密度:4.0
屏幕密度 DPI:640
屏幕缩放密度:4.0
它们都属于 XXXHDPI 类别,因此它们具有相同的字体大小,但 Galaxy S8 文本适合框,而 Galaxy S7 文本太大而超出框。
我错过了什么吗?
我有什么完全不同的方法可以在 Canvas 上绘制 HTML 文本吗?
================================================ ===
编辑:
更详细地解释我的用例:
我指的是一个 SVG/Vector 对象。
label_down.xml:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="90dp"
android:height="45dp"
android:viewportWidth="90"
android:viewportHeight="45">
<path
android:fillColor="?attr/labelColor"
android:pathData="M 0 0 L 0 37.532 L 36.63 37.532 L 45 45 L 53.371 37.532 L 90 37.532 L 90 0 Z" />
</vector>
然后我从该向量创建一个Bitamp 对象并在画布上绘制Bitmap。
VectorDrawableCompat vectorDrawableCompat = VectorDrawableCompat.create(getContext().getResources(), R.drawable.label_down, theme);
Bitmap bitmap = Bitmap.createBitmap(vectorDrawableCompat.getIntrinsicWidth(), vectorDrawableCompat.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
this.canvas.drawBitmap(bitmap, someXPos, someYPos, null);
这样做会导致如下结果:
现在,我的目标是在该框内创建文本。
希望这更有意义。
【问题讨论】:
-
我认为应该有一些其他的工作来实现你正在寻找的东西,也许你应该尝试一些其他的东西,而不是制作一个盒子并在那个盒子里绘制一个 html 文本。如果您能解释一下您的任务,那么人们可能会比在那个框中输入文本更能帮助您..只是说
-
@AdeelTurk 我已经用更多细节修改了我的问题。谢谢
-
我为我的聊天应用程序创建了相同的用户界面。我使用 9.patch 图像作为 textview 背景,它在所有设备和两个方向上都可以正常工作
-
所以我的意思是你为什么要绘制这个向量然后试图把文本放在这个盒子里你可以用其他方式做对..如果你想要这个 bg 的书面文本的位图然后您可以获取该文本视图的位图并在任何您想要的地方使用它..
-
@AdeelTurk 矢量是更大矢量的一部分,画布上还有很多其他东西。我不能将它全部作为一个位图来完成,因为矢量的某些部分是可点击的,而有些则不是。并且文本会根据用户在应用程序中所做的其他事情而变化,因此它不能只是框/矢量中的静态文本。
标签: android android-canvas textview android-vectordrawable