如何旋转 TextView 而不剪切其边界?

2024-01-02

我正在尝试旋转我的子类TextView using canvas.rotate():

canvas.save();

final int w = getWidth();
final int h = getHeight();

float px = w/2f;
float py = h/2f;
canvas.rotate(mAngle, px, py);

super.draw(canvas);

canvas.restore();

TextView 被旋转,但是我的视图的边界被剪裁:

我知道这是因为我的视图的大小 - 它在旋转过程中没有改变,而它应该改变。但是如果我改变宽度\高度onMeasure问题仍然存在 - 我正在使用LayoutParams.WRAP_CONTENT, so TextView只需根据中提供的值更改其大小setMeasuredDimensions.

我怎么解决这个问题?


我认为这里的整个问题是您正在使用 WRAP_CONTENT。当您执行此操作时,视图的剪辑矩形就是文本内容的大小。解决该问题的最简单方法是使用填充。像这样的东西,对我来说效果很好:

<com.example.twistedtext.TwistedTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="30dp"
    android:gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    twistedtext:rotation="30.0f"
    android:text="@string/hello_world" />

当然,如果您这样做,则必须为每个内容选择稍微不同的填充。如果您无法做到这一点,请重写 onMeasure,以便完全执行 TextView 的 onMeasure 的操作,然后根据旋转的需要添加相应的填充。

稍后添加: 事实上,弄清楚这一点很有趣。我有以下 onMeasure,效果很好:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int w = getMeasuredWidth();
    int h = getMeasuredHeight();
    w = (int) Math.round(w * cosA + h * sinA);
    h = (int) Math.round(h * cosA + w * sinA);
    setMeasuredDimension(w, h);
}

唯一剩下的问题是文本根据预旋转尺寸进行换行。你也必须解决这个问题...

sinA 和 cosA 在设置 mAngle 时计算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何旋转 TextView 而不剪切其边界? 的相关文章

随机推荐

  • 使用百分号作为前缀运算符名称的一部分

    我以为 of会比percent of为函数名 这是使用较长名称的工作代码 bin env perl6 Quick stats from gene exp diff file sub percent of return sprintf 1f
  • 如何将图像转换为 Base64 字符串?

    将图像 最大 200 KB 转换为 Base64 字符串的代码是什么 我需要知道如何使用 Android 来做到这一点 因为我必须在我的主应用程序中添加将图像上传到远程服务器的功能 并将它们作为字符串放入数据库的一行中 我正在 Google
  • 如何覆盖用户代理样式? [复制]

    这个问题在这里已经有答案了 我正在开发一个网页 我使用 css 样式表而不是内联样式 问题是 当我检查页面中 chrome 中的元素时 我可以看到几乎所有元素都继承了一些用户代理样式 我什至无法取消选中属性值 例如 div display
  • 我可以在 Google 云端硬盘中列出我的所有脚本而不包含任何其他类型的文档吗?

    Google Apps Scripts被整合到Google Drive去年 谁能告诉我如何列出我所有的scripts in Google Drive没有任何其他类型的文件 例如spreadsheets or text files 我可以通过
  • 当活动不自动旋转时,如何检查手机状态是横向还是纵向?

    活动不自动旋转
  • 可以通过 javascript 或 HTTP 标头检测*移动设备的类型*吗?

    我收到客户的请求 要求自动检测移动设备的类型 不是浏览器 类型 例如 Moto Q Blackjack II 等 并从支持的列表的下拉列表中自动选择设备设备 到目前为止 我发现HTTP标头 由移动IE提交 包含以下信息 解决 UA CPU
  • Akka演员道具工厂

    我和阿卡正在互相了解 From Akka 2 3 6 当前 Actor 推荐实践 http doc akka io docs akka current scala actors html actorselection scala Props
  • 延迟绑定生成的类内的 Gin 注入

    问题是 我有由 GWT 中的延迟绑定生成的代码 我想在这段代码中使用 Gin 注入 最初 我尝试在生成的类中放置一个带有 Inject 注释的私有构造函数 但 GWT 抱怨它没有公共 noargs 构造函数 无论如何 我在尝试注入没有绑定的
  • R 中“S”曲线上的权重点

    我在 R 数据框中有数据 想要对一列进行加权 days since 沿着 S 曲线 logit 曲线 特别是 向后的 S 曲线使得最近的事件将被赋予更大的权重 我使用这条曲线作为加权函数的原因是 它将对最近的事件给予较大的权重 而对遥远的事
  • Keycloak主题变量

    在 Keycloak 的基本模板中 有多个变量示例 可在 Freemarker 模板中访问 例如 在文件中 https github com keycloak keycloak blob master themes src main res
  • LINQ 自定义排序

    我想要按字母顺序排序 但有一个例外 我首先想要一个名称 Public 且 ID 0 的组 宁愿使用 ID 0 之后 然后按名称对其余部分进行排序 这不会首先返回公开 public IEnumerable
  • ComplexHeatmap,无法创建水平图例

    您好 我正在使用 ComplexHeatmap 包并遵循他们的小插图 但由于某种原因 我似乎无法强制图例变为水平 例如 这里是一个例子 set seed 123 library ComplexHeatmap mat matrix rnorm
  • 为什么 FileSystemWatcher 会触发两次

    为什么 FileSystemWatcher 会触发两次 有没有简单的方法可以修复它 当然 如果我更新或编辑文本文件 它应该只触发一次吗 这个链接在这里http weblogs asp net ashben archive 2003 10 1
  • 将文本文件中的内容加载到 sqlite 表中?

    我有只包含普通文本的简单文本文件 我想知道是否有一种方法可以将文本内容加载到 sqlite 中的表中 所以也许我可以Create table myTable nameOfText TEXT contents TEXT 然后把nameOfTe
  • 将元素从一个数组移动到另一个数组

    我尝试过以下操作斯塔克闪电战 https stackblitz com edit ng2 dragula base uabwzg file src 2Fapp 2Fapp component ts哪个使用ng2 dragula 我的问题在于
  • 将更改提交到 Git 中的多个分支

    典型使用场景 我有master branch foo 和branch bar 全部都是最新的 现在 我做了一个 git checkout master 并致力于错误修复 假设修复是在所有分支上处于相同状态的跟踪文件上 即 在修复之前 每个分
  • 需要帮助理解 CSS 选择性规则

    div a href class bar span class baz TEXT span a div 我是 CSS 菜鸟 但我的直觉告诉我a b
  • 返回脚本中使用的导入 Python 模块的列表?

    我正在编写一个程序 根据导入的模块对 Python 文件列表进行分类 因此 我需要扫描 py 文件的集合并返回它们导入的模块的列表 例如 如果我导入的文件之一包含以下行 import os import sys gtk 我希望它返回 os
  • 递归地从字符串中删除重复的字符

    我需要帮助来弄清楚如何从字符串中删除重复的字符 它必须递归地完成 这才是真正的问题 public class FEQ2 param args public static void removeDups String s int firstC
  • 如何旋转 TextView 而不剪切其边界?

    我正在尝试旋转我的子类TextView using canvas rotate canvas save final int w getWidth final int h getHeight float px w 2f float py h