2013-03-09 2 views
1

Я пытаюсь создать базовый график для своего приложения, но у меня небольшая проблема с ним. В настоящее время происходит то, что мой график генерируется, как я надеюсь, но когда я иду на график своих точек внутри него, точки всегда «отключены на 1», в частности, моя точка, которая должна сидеть в пятне 15 на график отображается в 14. То же самое верно для всех остальных точек моего графика, так как они также отображаются на 1 ниже, чем они должны быть. Я попытался добавить 1 к конду, но это, похоже, не изменило ни одной из фактических точек по мере их отображения, и просто сдвинуло мои метки на оси y, чтобы начать выше. Ниже приведен код, который, как я думаю, несет ответственность, но если требуется больше, просто спросите, и я опубликую, что спросили.Точки не выстраиваются в линию

Примечание: Это относится к назначению класса, целью которого является создание 2-й графики, поэтому я не могу использовать класс графического отображения, хотя знаю, что это гораздо проще.

код ниже:

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, он показывает его как по 15 на ось y. В настоящее время он показывает, что он находится рядом с 14.

ответ

1

Всякий раз, когда вы звоните point.getyCord(), просто добавьте + 1.

point.getyCord() + 1 

И можете ли вы подтвердить, что когда вы устанавливаете значение y, оно фактически входит в качестве требуемого значения.

+0

Да, когда код проходил через него, он проходил как необходимое значение, он просто не отображался в правой точке. Благодаря этому вам удалось добиться успеха, поэтому спасибо за это. – Gyhth

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(), вы не компенсируете ее одним.

два способа исправить это:

масштаб Изменить(), чтобы компенсировать вам

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

Если вы используете этот метод, вы должны также избавиться от переменной value вы использовали при рисовании ось, так как вы можете просто использовать ctr для строки.

  • Смещение ваш координату каждый раз

Как Колин Гиллеспи сказал, вы можете просто добавить 1 к point.getCord().

Я предпочитаю первый метод, так как он чище, и вам только когда-либо придется его компенсировать один раз, в этой функции. При втором методе, когда вы когда-либо проходите координату по шкале, вам придется помнить о ее компенсации.

+0

Это именно то, что я думал о проблеме, но я не был уверен. Очень ценим человека. – Gyhth

+0

Я, наверное, должен добавить, причина, по которой первый счетчик такой, какой он есть, обусловлен умножением по шкале; Я не хотел, чтобы все начиналось с самого дна, поэтому я просто бросил это, поскольку он, похоже, облегчил эту проблему. Спасибо, хотя человек. – Gyhth

Смежные вопросы