Android 安卓画布坐标系
我试图找到有关如何更改画布坐标系的信息。我有一些向量数据,我想用圆和线之类的东西画到画布上,但是数据的坐标系与画布坐标系不匹配 有没有办法将我使用的单位映射到屏幕的单位? 我正在绘制一个ImageView,它不会占用整个显示 如果我必须在每次绘图调用之前进行自己的计算,如何找到ImageView的宽度和高度? 我尝试的getWidth()和getHeight()调用似乎返回的是整个画布的大小,而不是ImageView的大小,这是没有帮助的 我看到一些矩阵的东西,这对我有用吗? 我尝试使用“公共虚空比例(float-sx,float-sy)”,但它更像是像素级的缩放,而不是通过扩展每个像素来实现矢量比例功能。这意味着,如果尺寸增加以适合屏幕,则线厚度也会增加Android 安卓画布坐标系,android,drawing,canvas,coordinate-systems,Android,Drawing,Canvas,Coordinate Systems,我试图找到有关如何更改画布坐标系的信息。我有一些向量数据,我想用圆和线之类的东西画到画布上,但是数据的坐标系与画布坐标系不匹配 有没有办法将我使用的单位映射到屏幕的单位? 我正在绘制一个ImageView,它不会占用整个显示 如果我必须在每次绘图调用之前进行自己的计算,如何找到ImageView的宽度和高度? 我尝试的getWidth()和getHeight()调用似乎返回的是整个画布的大小,而不是ImageView的大小,这是没有帮助的 我看到一些矩阵的东西,这对我有用吗? 我尝试使用“公共虚
更新:
经过一些研究,我开始认为没有办法把坐标系改成别的东西。我需要将所有坐标映射到屏幕的像素坐标,并通过修改每个向量来实现。getWidth()和getHeight()现在对我来说似乎更好了。我可以说是哪里出了问题,但我怀疑我不能在构造函数中使用这些方法 据我所知,在Android中动态定制矢量图形的唯一方法是将所有内容绘制到图像文件中,然后将其放入
ImageView
。我不确定我是否完全理解您的要求,但如果唯一的问题是缩放,ImageView将使用android:scaleType=“center”
作为ImageView
的属性,将给定的任何图像缩放到自己的大小
至于改变坐标系,我怀疑这是可能的(尽管我还没有研究过)。不过,编写一个将数据系统映射到标准Android坐标系的函数可能相当简单。谢谢您的回复。我几乎已经放弃了让它以我认为应该的方式工作。当然,我认为事情应该如何发生并不是它们如何发生 这是它的基本工作原理,但在某些情况下,它似乎偏离了一个像素,当事情落在一些我还没有弄清楚的边界条件上时,圆圈似乎缺少了部分。就个人而言,我认为这是不可接受的内部应用程序代码,应该在Android库。。。如果你为谷歌工作,眨眨眼,轻推轻推。:)
您可以使用画布矩阵的
preScale()
方法将画布坐标缩放到您自己的单位。请注意,这也会缩放绘制的笔划宽度,这可能不是您想要的。是的,getWidth()和getHeight()在构造函数中肯定不起作用。请原谅我的代码的代码格式设置。在我发布之前,代码看起来很棒,但是在StackOverflow之后,它似乎做了一些疯狂的事情。
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);
}
...
}