我正在尝试为我的应用程序创建一个基本的图形,但我遇到了一个小问题。目前,我的图是按照我所希望的那样生成的,但是当我在图中绘制我的点时,这些点总是“差1",具体地说,我应该位于图中点15的点显示在14处。对于我的图中的所有其他点也是如此,因为它们也比应该显示的低1。我尝试将1加到cond上,但这似乎没有改变显示的任何实际点,只是简单地移动了y轴上的标签以开始更高的位置。下面是我认为是负责任的代码,但如果需要更多,只需询问,我将发布所询问的内容。
代码如下:
public class GraphicsView extends View {
ArrayList<Point> points = new ArrayList<Point>();
Path xPath = new Path();
Path yPath = new Path();
Path zPath = new Path();
Path drawGrid = new Path();
...
Integer xAxis;
Integer yAxis;
@Override
protected void onDraw(Canvas canvas) {
Integer counter = points.size();
Integer xCord;
super.onDraw(canvas);
yAxis = this.getHeight();
xAxis = this.getWidth();
canvas.drawColor(R.color.Background);
<Setting different paint objects to the right colors here>
xPath.moveTo(20, yAxis-20);
yPath.moveTo(20, yAxis-20);
zPath.moveTo(20, yAxis-20);
drawGrid.moveTo(22, yAxis-20);
drawGrid.lineTo(22, 0);
canvas.drawPath(drawGrid,grid);
drawGrid.moveTo(22, yAxis-20);
drawGrid.lineTo(xAxis, yAxis-22);
canvas.drawPath(drawGrid,grid);
//Left right Axis (X)
for (Integer ctr = counter; ctr > 0; ctr--) {
Integer value = counter- ctr + 1;
canvas.drawText(value.toString(), (xAxis-20)/ctr,yAxis-5, grid);
}
//Up down Axis (Y)
for (Integer ctr = 1; ctr < 22; ctr++) {
Integer value = ctr - 1;
canvas.drawText(value.toString(), 5, scale(yAxis, ctr), grid);
}
for (Point point : points)
{
xCord = ((xAxis -20) / counter);
xPath.lineTo(xCord, scale(yAxis,point.getxCord()));
xPath.addCircle(xCord, scale(yAxis, point.getxCord()), 2, Direction.CW);
yPath.lineTo(xCord, scale(yAxis, point.getyCord()));
yPath.addCircle(xCord, scale(yAxis,point.getyCord()), 2, Direction.CW);
zPath.lineTo(xCord, scale(yAxis, point.getzCord()));
zPath.addCircle(xCord, scale(yAxis, point.getzCord()), 2, Direction.CW);
canvas.drawPath(xPath, xPaint);
canvas.drawPath(yPath, yPaint);
canvas.drawPath(zPath, zPaint);
counter -= 1;
}
}
private Integer scale(Integer Axis, Integer cord) {
Integer point = 0;
point = (Axis - (((Axis-20)/21)) * cord);
return point;
}
}目前,它显示它在14旁边。
发布于 2013-03-09 11:48:45
无论何时调用point.getyCord(),只需添加一个+ 1即可。
point.getyCord() + 1你能确认,当你设置一个y值时,它实际上是作为期望值。
发布于 2013-03-09 12:23:22
你的问题出在这里:
for (Integer ctr = 1; ctr < 22; ctr++) {
Integer value = ctr - 1;
canvas.drawText(value.toString(), 5, scale(yAxis, ctr), grid);Y轴以标签0开始,但它会将其置于1位置,因为它是value = ctr - 1。当您稍后使用scale()函数时,不会将其偏移1。
有两种方法可以解决这个问题:
为您的偏移量修改()
private Integer scale(Integer Axis, Integer cord) {
Integer point = 0;
point = (Axis - (((Axis-20)/21)) * (cord + 1));
return point;
}如果使用这种方法,还应该去掉绘制轴时使用的value变量,因为也可以对字符串使用ctr。
正如科林·吉莱斯皮所说,你可以在point.getCord()上加1。
我更喜欢第一种方法,因为它更干净,而且你只需要在那个函数中偏移它一次。使用第二种方法时,无论何时将坐标传递给scale,都必须记住对其进行偏移。
https://stackoverflow.com/questions/15306455
复制相似问题