积分不排队

时间:2013-03-09 02:23:31

标签: java android graphics graph

我正在尝试为我的应用程序创建一个基本图形,但我遇到了一个小问题。现在,发生的事情是我的图表是按照我希望的方式生成的,但是当我在其中绘制我的点数时,点数总是“偏离1”,具体来说,我的观点应该位于第15点。图形显示在14.对于我的图表中的所有其他点也是如此,因为它们也显示为低于应有的1。我试图将1添加到cond,但这似乎没有改变任何实际点,因为它们被显示,并简单地移动我的标签在y轴上开始更高。下面是我认为负责的代码,但如果需要更多,只需询问,我将发布所要求的内容。

注意:这是一个类赋值,其目的是生成2D图形,所以我不能专门使用图形类,虽然我知道这样做要容易得多。

代码如下:

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

重申一下,我正在寻找的是一种解决方法,以便当一个值设置为15时,它会显示为沿y轴上的15。目前,它显示它在14旁边。

2 个答案:

答案 0 :(得分:1)

每当您致电point.getyCord()时,只需向其添加+ 1

point.getyCord() + 1

您可以确认,当您设置y值时,它实际上是作为所需的值。

答案 1 :(得分:1)

你的问题在于:

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()函数时,不要将其偏移一。

解决此问题的两种方法:

将scale()修改为偏移量

private Integer scale(Integer Axis, Integer cord) {
    Integer point = 0;
    point = (Axis - (((Axis-20)/21)) * (cord + 1));
    return point;
}

如果使用此方法,您还应该删除绘制轴时使用的value变量,因为您也可以使用ctr作为字符串。

  • 每次偏移y坐标

正如Colin Gillespie所说,你可以在point.getCord()添加1。


我更喜欢第一种方法,因为它更干净,而且你只需要在该函数中将其偏移一次。使用第二种方法,每当你将坐标传递给比例时,你都必须记住要抵消它。