为什么画布与 onDraw 中视图的大小不同? (安卓)

2024-01-08

我尝试过这个

@Override
protected void onDraw(Canvas canvas)
{
    Log.e("TEST", "canvas width: " + canvas.getWidth() + "");
    Log.e("TEST", "view width: " + this.getWidth() + "");

    Log.e("TEST", "canvas height: " + canvas.getHeight() + "");
    Log.e("TEST", "view height: " + this.getHeight() + "");
    super.onDraw(canvas);
    Log.e("TEST", "canvas width: " + canvas.getWidth() + "");
    Log.e("TEST", "view width: " + this.getWidth() + "");

    Log.e("TEST", "canvas height: " + canvas.getHeight() + "");
    Log.e("TEST", "view height: " + this.getHeight() + "");
}

这是结果:

canvas width: 320
view width: 480
canvas height: 533
view height: 300
canvas width: 320
view width: 480
canvas height: 533
view height: 300

来自我的 main.xml 的部分

    android:layout_width="480px"
    android:layout_height="300px"

根据我的日志打印和我的 xml 的一部分,视图的大小是正确的。 我的设备是 480x800,宽度和高度除以 Log 结果得到 1.5(800/533=1.5 和 480/320=1.5),所以看起来我从整个屏幕获取 Canvas 来绘制。为什么会这样,为什么它这么小,我应该怎么做才能以正常方式绘制?


SuitUp,

视图管理的画布对象可能始终与您的屏幕尺寸不同。很大程度上取决于您使用上述逻辑的对象。原因是 Android 创建一个新的画布或重用旧的画布,具体取决于父级和子级的渲染方式以及处理周期中的调用位置。当您覆盖行为并动态更改视图时,事情会变得更加奇怪(特别是如果您在布局/测量/绘制周期期间这样做)。

为什么会这样,为什么这么小……

画布的大小基于其所在对象的布局参数。如果您覆盖 onMeasure 或 onLayout,画布将仅重新调整需要重新调整的部分。如果您对画布尺寸有疑问,您确实需要检查正在绘制的视图的布局参数。有时它会更大,有时会更小。它只会与具有以下内容的顶级视图/视图组中的屏幕大小相同match_parent (or fill_parent)对于两个layout_width and layout_height在全屏(无通知栏)的活动中并且不使用Theme.Dialog style.

...我应该怎么做才能以正常方式绘制?

这取决于您所说的正常是什么意思以及您的需求是什么。如果您尝试手动管理整个 UI,那么您必须控制顶层对象。这通常是通过扩展顶级视图来完成的,以便您可以覆盖该行为。启动器通过覆盖顶级 FrameLayout 及其子视图来实现此目的。请注意,这可能会很昂贵,因为如果你有足够大的画布,你可以从屏幕上绘制东西。

大多数程序都使用子视图并简单地覆盖它们的绘制方式,并理解子视图不应控制父视图的绘制方式。在这种情况下,画布很小且有限,但它优化了逻辑并允许对象相应移动,同时保持渲染稳定。

游戏使用全屏SurfaceView以实现他们的需求。这提供了一个非常灵活的画布,优先考虑手动和不断变化的演示。有许多示例和教程展示了如何执行此操作。只需在 Google 中搜索SurfaceView.

一般来说,对于大多数视图,可以利用其面向对象的特性来使用默认的渲染和绘制方法。正确利用 onMeasure 和 onLayout 等函数通常可以达到预期的效果。在不了解更多关于您的特殊需求的情况下,这是可以给出的最佳建议。

更多信息(不确定相关性)

了解 Android 如何呈现视图对于获得理想的结果至关重要。引擎中包含了如此多的内容,以至于它必须考虑多个屏幕,以及在给定许多不同参数的情况下呈现同一视图的不同方式。我会研究如何利用布局参数来减少您必须做的工作量。此外,还有很多关于onMeasure、onLayout和onDraw之间关系的信息。在许多情况下,只需将正确的参数应用于正确的视图,就会对正确渲染对象所需的控制量产生巨大的影响。

希望这可以帮助,

模糊逻辑

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

为什么画布与 onDraw 中视图的大小不同? (安卓) 的相关文章

  • Android ListView 子项

    我最近为 Android 应用程序创建了一个新的 ListView 对象 但遇到了一些错误 当我尝试使用简单适配器创建一个包含列表中子项目的项目时 创建的最新项目与其他项目重叠 我正在使用地图列表来创建项目 例如 如果我向地图列表中添加一个
  • 如何在 Android 应用程序中每天重复一个操作?

    我每天都想重复一个动作 即使应用程序未运行或设备已重新启动 重新启动 它也必须继续工作 在我的代码中 我尝试每 1 分钟显示一条 TOAST 消息 作为测试 它在模拟器中工作正常 但在真实设备上不起作用 我尝试对修复进行一些更改 正如我在一
  • tns run android --emulator 不工作 - NativeScript

    我已按照此步骤操作link http docs nativescript org tutorial chapter 1 当我使用命令运行时tns run android emulator 我在命令提示符中收到以下错误 Configuring
  • 使用 Gradle 检测 IDE 环境

    无论如何 有没有办法检测我正在运行我的项目的环境 像这样的事情 构建 gradle def usingIntelliJ def usingAndroidStudio if usingIntelliJ buildConfigField Str
  • 带 html 表格的 TextView

    我有个问题 我想放入 TextView html 格式文本 我添加如下
  • 自动调整文本视图大小不起作用

    您好 我在我的 Android 应用程序中使用自动调整大小文本视图 我的应用程序 minSdkVersion 是 19 所以我正在使用支持库 https developer android com guide topics ui look
  • 如何使用 Java 代码在 Android 中显示图像

    我尝试使用 java 代码而不是 xml 在 android 中显示图像 我已经使用 xml 文件完成了它 但我的要求是使用 java代码以获得更多功能 预先感谢您的帮助 如果你想从drawable文件夹加载图像 你可以使用 ImageVi
  • 当我将 Android Studio 迁移到更高分辨率的显示器时,文本变得模糊

    is there any way I can change the resolution of Android Studio recently I migrate my Android Studio from rMBP 13 to rMBP
  • 在 MVVM 中使用 LiveData 进行观察时,如何在 onChanged() 上编写单独的代码? [未解决]

    所以 我实施了 public class DriverLoginActivity extends BaseActivity implements Observer
  • Android Studio 3.2.1 升级后构建错误

    我正在从 Udacity 构建一个示例项目 到目前为止 一切正常 但升级到 Android Studio 3 2 1 后 我遇到了下面的构建错误 摇篮版本 4 6 项目链接 https github com udacity ud851 Su
  • 在原生 Android 应用程序中使用 WebView 整个布局有用吗?

    我目前正在开发一个原生 Android 应用程序 我的应用程序有很多活动 我要发展native安卓应用程序 但在某些情况下 我想使用webview整个布局只是一个网络视图 不是线性的或相对的或其他布局 只是一个网络视图 所有图像和其他内容都
  • Eclipse Android 不会清理,不会刷新资源

    我升级到Ubuntu 11 10 Eclipse 3 7 0 ADT 14 0 0 当我替换桌面上 res drawable nodpi 目录中的图片资源或 res raw 目录中的声音资源时 重新编译的程序和 Project Explor
  • 两个具有相同 id 的视图

    安卓如何使用R id id name膨胀 XML 后查找视图 1 假设我有两个 XML 每个按钮都有相同的 id 2 我对它们进行了膨胀并将它们转换为视图 3 R id类中只有一个int将为这两个按钮创建 android 如何区分这些具有相
  • Android,在连接wifi的情况下与移动数据通信,无需上网

    我有一个汽车配套应用程序 需要与 WiFi 和移动数据网络进行通信 我的车辆控制单元提供了一个无需互联网访问的 WiFi 网络 它公开了我们可以从应用程序调用的 API 服务 除此之外 我们还需要使用手机移动数据 3G 4G 与另一个可通过
  • 旋转器扩展到屏幕边界之外

    我有一个布局 其中包含一个三行的 TableLayout 每行都有一个 TextView 和一个 Spinner Spinners 的柱子设置为拉伸 我的问题是 当旋转器包含长字符串时 旋转器会超出屏幕边缘 我希望他们截断字符串 这是问题的
  • 在选择项目之前设置微调器的文本

    我有一个包含三个项目的微调器 我使用 XML 字符串数组资源来为其提供数据 当您打开活动时 微调器通常会显示数组列表中的第一项 我想更改它并在选择项目之前在微调器中显示文本 选择一个 我怎样才能做到这一点 您可以通过以下两种方式之一进行操作
  • android.R.layout.simple_list_item_1是什么?

    在我看到的所有示例中 他们在创建 ArrayAdapter 时仅使用 android R layout simple list item 1 android R layout simple list item 1是什么 它只是一个名为sim
  • 应用程序启动时显示徽标几秒钟

    我想在应用程序启动并且菜单可见之前显示徽标几秒钟 当它消失时我也想使用一些 我应该创建一个新活动吗 我可以在布局中设置它吗 为包含您的徽标的初始屏幕定义一个布局 然后将此代码添加到您的活动中 public void onCreate Bun
  • 如何使用支持FileProvider将内容分享给其他应用程序?

    我正在寻找一种使用 Android 支持库与外部应用程序正确共享 而不是打开 内部文件的方法文件提供者 http developer android com reference android support v4 content File
  • 如何将数据从普通 Android 应用程序传递到 Google glass 应用程序,反之亦然?

    我不知道 GoogleGlass 只是搜索它 我已经检查了下面的链接 但我认为下面的链接已被弃用 我无法找到传递数据的方法 我已经搜索了 4 天以上 但无法找到传递数据的方法 想要为谷歌眼镜创建应用程序 https stackoverflo

随机推荐

  • 使用 JavaScript 从元素中删除 CSS 类(无 jQuery)[重复]

    这个问题在这里已经有答案了 谁能告诉我如何仅使用 JavaScript 删除元素上的类 请不要用 jQuery 给我答案 因为我不会使用它 而且我对此一无所知 正确且标准的方法是使用classList 就是现在大多数现代浏览器的最新版本得到
  • cd 到以“-”破折号开头的目录[重复]

    这个问题在这里已经有答案了 我正在学习 Git 我的第一个任务是导航到我的项目所在的目录 不幸的是 我的文档主文件夹具有以下形式 folder1 出于排序目的 以及每次我进入时 cd folder1 我收到错误 bash cd 参数太多 在
  • 如何删除/重命名 SQL 中的重复列(不是重复行)

    当尝试从 Sybase 到 Microsoft SQL 执行 OPENQUERY 时 我遇到错误 通过以下方式获得的结果集中不允许有重复的列名 OPENQUERY 和 OPENROWSET 列名 PatientID 重复 我构建的查询根据相
  • 我们如何在 C# 中设置 Excel 图表的位置?

    我正在尝试从 C 生成 Excel 图表 图表是通过查找生成的 但它总是出现在屏幕的中央 如何设置图表的位置 Thanks 我的代码如下所示 Microsoft Office Interop Excel Workbook ebook Mic
  • Lisp 中 1 和 '1 有什么区别?

    我从来没有真正考虑过 Lisp 中的符号是否可以是数字 所以今天我尝试了一下 gt 1 1 gt 1 1 2 gt 1 1 2 gt define a 1 gt a 1 2 上面的代码是方案 但在 Common Lisp 和 Clojure
  • Django:为每个请求/表单生成新的 CSRF 令牌

    我们是否可以更改每个表单请求甚至每个请求的 CSRF 令牌 而不是一个活动会话的相同令牌 假设您有权访问request object from django middleware csrf import rotate token rotat
  • 获取特定类的所有对象

    我必须通过引用列出作为类实例的对象 class Foo class Foo1 obj1 new Foo obj2 new Foo obj32 new Foo1 我需要一个解决方案来获取 Foo 类实例的所有对象 你知道怎么做吗 获取类的所有
  • 无法使用 Appium 移动 Android SeekBar

    我有一个像这样的定制Android搜索栏 以及它可以移动到的位置 它从中间开始 我想先移动滑块 然后检查它是否已保存 我有一个使用 TouchAction 的方法 public void moveSeekBar WebElement see
  • 二叉搜索树相对于哈希表的优点

    二叉搜索树相对于哈希表有哪些优点 哈希表可以在 Theta 1 时间内查找任何元素 并且添加元素也同样容易 但我不确定相反的优势 没有人指出的一项优点是二叉搜索树允许您有效地进行范围搜索 为了说明我的想法 我想举一个极端的例子 假设你想要获
  • 在 Xml 映射中使用 Hibernate 设置创建和更新时间

    我正在使用 HibernateXml映射 我有一个有两个字段的实体创建日期 and 更新日期类型的timestamp 当实体被持久化和更新时 必须用当前的 UTC 时间填充 我知道 的存在 PrePersist and PreUpdate注
  • CMU Sphinx 4 - 5 pre alpha 安装指南

    CMU Sphinx 4 5prealpha 最新版本 有好的 最好是分步安装指南吗 我找不到任何内容 而且官方指南已经过时了 我一直在尝试按照这些步骤操作 但完成后我缺少 2 个 jar jsapi 和标签 如果我尝试从 eclipse
  • 如何使用脚本化管道方法在参数化构建中定义标签参数

    我正在尝试解决与此问题相同的问题 如何使用管道插件在特定节点上触发詹金斯构建 https stackoverflow com questions 38240943 how to trigger a jenkins build on spec
  • Neo4j中如何找到跳数最少的最短路径?

    我正在建模一个图表 其中节点是位置 边缘表示您可以从一个地方到达另一个地方 这是拥有从一个地方到另一个地方可以采取的所有路线 并且您可以通过不同的路线从一个地方到达另一个地方 因此我想要一个查询 该查询可以返回路线变化最少的最短路径 比如我
  • 获取应用程序的Django版本

    我正在开始一个新的 实际上非 常旧的 项目 我知道它是在 Django 中的 我不知道它所构建的 Django 的确切版本 有没有办法知道我的应用程序正在运行的 Django 版本 唯一的方法就是猜测 我首先查看 settings py 文
  • 通过javascript获取SVG图形的大小

    要在 html 页面中添加 svg 图形 通常使用对象标签将其包裹起来 如下所示 this browser is not able to show SVG a href http getfirefox com http getfirefox
  • 如何调用工厂服务中定义的ng-click函数

    如何调用 ng click 中定义的工厂服务中的函数 app factory MyFactory function return setTest function test alert test app controller TestCtr
  • UserManager.FindAsync(用户名,密码)在 ASP.NET 5 / Identity 3 中不可用

    我正在尝试将项目升级到 ASP NET 5 MVC 6 AspNet Identity 附带的 UserManager 曾经有一个 FindAsync 方法 我可以在其中传递用户名和密码 它似乎不再存在了 我认为我不需要 SigninMan
  • Wildfly 8.2 中的 Kerberos sql server 数据源

    我在 Wildfly 8 2 0 上设置针对 MS Sql Server 的 Kerberos 集成身份验证时遇到问题 这是我到目前为止所做的 设法在 Wildfly 9 0 2 上运行它 只是因为 Wildfly 9 包含 新 登录模块类
  • 如何在此代码中向表格单元格添加点击事件?

    在此代码中 我想使用 JavaScript 使表格单元格可单击 还请告诉我如何在点击事件中使用 i j 值
  • 为什么画布与 onDraw 中视图的大小不同? (安卓)

    我尝试过这个 Override protected void onDraw Canvas canvas Log e TEST canvas width canvas getWidth Log e TEST view width this g