Android 画布坐标系

2024-01-28

我正在尝试查找有关如何更改画布坐标系的信息。我有一些矢量数据,想使用圆形和线条等绘制到画布上,但数据的坐标系与画布坐标系不匹配。

有没有办法将我正在使用的单位映射到屏幕的单位?

我正在绘制一个不占用整个显示屏的 ImageView。

如果我必须在每次绘图调用之前进行自己的计算,如何找到 ImageView 的宽度和高度?

我尝试的 getWidth() 和 getHeight() 调用似乎返回整个画布大小,而不是 ImageView 的大小,这没有帮助。

我看到一些矩阵的东西,这对我有用吗?

我尝试使用“public void scale(float sx, float sy)”,但这更像是像素级缩放,而不是通过扩展每个像素的矢量缩放函数。这意味着如果增加尺寸以适应屏幕,则线条粗细也会增加。


Update:

经过一些研究后,我开始认为没有办法将坐标系更改为其他坐标系。我需要将所有坐标映射到屏幕的像素坐标,并通过修改每个向量来实现。 getWidth() 和 getHeight() 现在似乎对我来说效果更好。我可以说出了什么问题,但我怀疑我不能在构造函数中使用这些方法。


谢谢回复。我几乎已经放弃了让它按照我认为应该的方式工作。当然,我认为事情应该如何发生并不代表事情确实如此发生。 :)

这基本上是它的工作原理,但在某些情况下它似乎会偏离一个像素,并且当物体落在我尚未弄清楚的某些边界条件上时,圆圈似乎会丢失部分。就我个人而言,我认为这在应用程序代码内部是不可接受的,应该在 Android 库中......眨眨眼,如果你在 Google 工作,请轻推。 :)

private class LinearMapCanvas
{
    private final Canvas canvas_; // hold a wrapper to the actual canvas.

    // scaling and translating values:
    private double scale_;

    private int translateX_;
    private int translateY_;

// linear mapping from my coordinate system to the display's:
    private double mapX(final double x)
    {
    final double result = translateX_ + scale_*x;
    return result;
    }

    private double mapY(final double y)
    {
        final double result = translateY_ - scale_*y;
        return result;
    }

    public LinearMapCanvas(final Canvas canvas)
    {
        canvas_ = canvas;

// Find the extents of your drawing coordinates:
        final double minX = extentArray_[0];
    final double minY = extentArray_[1];
    final double maxX = extentArray_[2];
    final double maxY = extentArray_[3];

// deltas:
    final double dx = maxX - minX;
    final double dy = maxY - minY;

// The display's available pixels, accounting for margins and pen stroke width:
    final int width = width_ - strokeWidth_ - 2*margin_;
    final int height = height_ - strokeWidth_ - 2*margin_;

    final double scaleX = width / dx;
    final double scaleY = height / dy;

    scale_ = Math.min(scaleX , scaleY); // Pick the worst case, so the drawing fits

// Translate so the image is centered:
        translateX_ = (int)((width_ - (int)(scale_*dx))/2.0 - scale_*minX);
        translateY_ = (int)((height_ - (int)(scale_*dy))/2.0 + scale_*maxY);
    }

// wrappers around the canvas functions you use.  These are only two of many that would need to be wrapped.  Annoying and error prone, but beats any alternative I can find.
    public void drawCircle(final float cx, final float cy, final float radius, final Paint paint)
    {
    canvas_.drawCircle((float)mapX(cx), (float)mapY(cy), (float)(scale_*radius), paint);
    }

    public void drawLine(final float startX, final float startY, final float stopX, final float stopY, final Paint paint)
    {
    canvas_.drawLine((float)mapX(startX), (float)mapY(startY), (float)mapX(stopX), (float)mapY(stopY), paint);
    }
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 画布坐标系 的相关文章

  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • 是否可以将数组或对象添加到 Android 上的 SharedPreferences

    我有一个ArrayList具有名称和图标指针的对象 我想将其保存在SharedPreferences 我能怎么做 注意 我不想使用数据库 无论 API 级别如何 请检查SharedPreferences 中的字符串数组和对象数组 http
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • MediatR 发布和 MediatR 发送

    我已经尝试使用 MediatR 的 CQRS 模式 并且喜欢正在处理的应用程序正在转换的干净状态 在我见过和使用的所有例子中 我总是这样做 await Mediator Send command 查询也是一样的 var data await
  • float32 和 float64 之间的真正区别

    我想了解之间的实际区别float16 and float32从结果精度来看 例如 NumPy 允许您选择所需数据类型的范围 np float16 np float32 np float64 我担心的是 如果我决定使用 float16 来保留
  • 删除默认构造函数令人头疼

    我的 C 书是这么说的 lippman c Primer 第五版 第 508 页 如果类 有一个 const 成员 其类型未显式定义默认构造函数 则合成的默认构造函数被定义为已删除and该成员没有类内初始值设定项 强调我的 那么为什么这段代
  • 使用套接字 io 向所有浏览器发送消息

    我正在摆弄socket io和node js 并且想知道如何完成以下任务 我有一个简单的表单 将文本字符串发送到服务器 服务器将其发回 并将其附加到div中 我想做的是为所有浏览器中的所有用户更新该 div 目前它只更新发送消息的浏览器 来
  • 拒绝应用来自...的样式,因为其 MIME 类型('text/html')不是受支持的样式表 MIME 类型,并且启用了严格的 MIME 检查

    此错误仅在 Chrome 中显示 我正在搜索这个问题 但还没有找到令人满意的解决方案 我附上了该错误的屏幕截图 请为此提出一些想法 错误图像 https i stack imgur com 6IAxV png 样式表的 MIME 类型应为t
  • 是否可以在 Wear OS 中永久可靠地运行网络 ping 服务?

    我正在尝试找到一种在 Wear OS 上以可靠的方式运行网络心跳服务的方法 目标是有一个进程每 x 分钟发送一次网络请求 无论设备的状态如何 屏幕开 关 充电 关闭充电器等 有可能实现吗 我的方法是运行前台服务 https develope
  • SSDT 创建回滚部署脚本?

    我们可以使用TFS SSDT创建SQLServer部署脚本 但是有没有办法创建回滚脚本 以便我们可以回滚部署 谢谢 由于 SSDT 和类似产品 都是通过将项目中的模式与实时数据库进行比较来使数据库与模型同步来工作的 因此没有直接的方法来创建
  • 可以使用 Window.Onscroll 方法来检测滚动方向吗?

    可以使用 Window Onscroll 方法来检测滚动方向吗 如果您在页面加载时以及每次发生滚动事件时记录scrollX和scrollY 那么您可以将以前的值与新值进行比较 以了解滚动的方向 这是概念证明 function scrollF
  • 从 .NET Windows 服务调用本机 DLL 失败

    我有一个本机 dll 形式的第 3 方 API 我使用 C 调用它DllImport 此本机 dll 依赖于打开的第 3 方应用程序 当我正常运行代码时 API 会执行预期的操作并驱动应用程序 然而 当我运行与 Windows 服务相同的代
  • 将点分布在边界内的表面上

    我对一种在 4 面 如正方形 上分布预定义数量的点的方法 算法 感兴趣 主要问题是每个点必须具有彼此之间的最小和最大接近度 两个预定义值之间的随机值 基本上 任何两点的距离不应小于 2 也不应大于 3 我的代码将用 ruby 实现 点是位置
  • 一年中的每个星期?

    我试图通过一年中的周数和一年中的周数来获取一年中的月份数 例如 第 1 周是 1 月 返回 1 第 6 周是 2 月 所以我想要 2 我试着去date parse from format W Y 但没有成功 这给了我错误 有什么办法可以一起
  • 运行 sbt 的项目根目录中的 java.lang.NullPointerException

    我从 Scala 开始 尝试在我的项目文件夹中运行 sbtbuild sbt是 当我收到此错误时 此文件夹是唯一的文件夹 如果我在src文件夹或我的文档文件夹中我没有 收到错误 谁能告诉我为什么会发生这种情况 我不知道如何表示文件夹结构 它
  • 在 Linux 上如何获取中断向量号?

    当我运行 cat proc interrupts 时 我可以得到以下信息 CPU0 CPU1 0 253 1878 IO APIC edge timer 1 3 0 IO APIC edge i8042 7 1 0 IO APIC edge
  • jQuery UI Datepicker - 禁用特定日期

    有没有任何 简单 方法可以将 jQuery UI Datepicker 设置为不允许选择特定的预定日期 我能够得到这种方法 https stackoverflow com questions 501943 can the jquery ui
  • Ionic 4:滚动时隐藏离子标签栏,就像 LinkedIn 应用程序一样

    我正在使用默认的 ion tab bar 和底部放置 如 LinkedIn 应用程序中所示 我想在滚动时隐藏标签栏并在滚动停止时再次显示它 这个功能可以在LinkedIn应用程序中看到 这是 tabs page html
  • asp.net、gettype() 和完全限定类名

    我已经阅读了这里的其他一些线程 尽管它们都没有真正解释如何解决我的问题 我有一个带有以下页面的网络应用程序 代码隐藏 namespace Company Web UI Content public partial class Home Lo
  • Yii2 在单个事务中的单个保存调用中保存相关记录

    在 yii2 中 我如何将多个相关记录保存到数据库中到单个保存调用和单个事务中 我有两张桌子 User id name UserAddress id user id city User 表与 UserAdress 表具有一对多关系 我想做的
  • 使用 has_many :through 时连接模型中的验证失败

    我的完整代码可以在以下位置查看https github com andyw8 simpleform examples https github com andyw8 simpleform examples 我有一个加入模型ProductCa
  • 芝麻服务器对 SPIN 的支持

    我是 SPIN 的新手 我阅读了文档并查找了一些示例 但我想开始使用它 我看到了一些工具http topquadrant com http topquadrant com对于 SPIN 但我已经使用 openrdf sesame 服务器一段
  • Android 画布坐标系

    我正在尝试查找有关如何更改画布坐标系的信息 我有一些矢量数据 想使用圆形和线条等绘制到画布上 但数据的坐标系与画布坐标系不匹配 有没有办法将我正在使用的单位映射到屏幕的单位 我正在绘制一个不占用整个显示屏的 ImageView 如果我必须在