gpt4 book ai didi

Android Canvas 坐标系统

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:05 28 4
gpt4 key购买 nike

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

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

我正在绘制一个没有占据整个显示的 ImageView。

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

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

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

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


更新:

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

最佳答案

感谢您的回复。我几乎已经放弃了让它以我认为应该的方式工作。当然,我认为事情应该如何发生并不是它们确实如何发生。 :)

这基本上是它的工作原理,但在某些情况下它似乎偏离了一个像素,当事情落在我尚未弄清楚的某些边界条件时,圆圈似乎缺少部分。我个人认为这在应用程序代码中是 Not Acceptable ,应该在 Android 库中......眨眼眨眼,如果你为谷歌工作,请轻推。 :)

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);
}
...
}

关于Android Canvas 坐标系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2931278/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com