onDraw () сработал, но результаты не отображаются - PullRequest
0 голосов
/ 11 марта 2010

У меня есть следующая процедура в подклассе представления:

Он вычисляет массив точек, которые составляют линию, затем стирает предыдущие линии, а затем рисует новые линии (воздействие относится к ширине в пикселях, нарисованных несколькими линиями). Линия - это ваша базовая кривая колокола, сжатая или растянутая по дисперсии и x-коэффициенту.

К сожалению, на экране ничего не отображается. Предыдущая версия с drawPoint () и без массива работала, и я проверил, что содержимое массива загружается правильно, и я вижу, что мой onDraw () запускается.

Есть идеи, почему его нельзя нарисовать? Заранее спасибо!

 protected void drawNewLine( int maxx, int maxy, Canvas canvas, int impact, double  variance,  double xFactor, int color) {
  // impact = 2 to 8; xFactor between 4 and 20; variance between 0.2 and 5
  double x = 0;
  double y = 0;
  int cx = maxx / 2;
  int cy = maxy / 2;
  int mu = cx;
  int index = 0;
  points[maxx<<1][1] = points[maxx<<1][0];
  for (x = 0; x < maxx; x++) {
   points[index][1] = points[index][0];
   points[index][0] = (float) x;
   Log.i(DEBUG_TAG, "x: " + x);
   index++;
   double root = 1.0 / (Math.sqrt(2 * Math.PI * variance));
   double exponent = -1.0 * (Math.pow(((x - mu)/maxx*xFactor), 2) / (2 * variance));
   double ePow = Math.exp(exponent);
   y = Math.round(cy * root * ePow);
   points[index][1] = points[index][0];
   points[index][0] = (float) (maxy - y - OFFSET);

   index++;
  }
  points[maxx<<1][0] = (float) impact;

  for (int line = 0; line < points[maxx<<1][1]; line++) {
   for (int pt = 0; pt < (maxx<<1); pt++) {
    pointsToPaint[pt] = points[pt][1];
   }
   for (int skip = 1; skip < (maxx<<1); skip = skip + 2)      
                          pointsToPaint[skip] = pointsToPaint[skip] + line;
   myLinePaint.setColor(Color.BLACK);
   canvas.drawLines(pointsToPaint, bLinePaint); // draw over old lines w/blk
  } 

  for (int line = 0; line < points[maxx<<1][0]; line++) {
   for (int pt = 0; pt < maxx<<1; pt++) {
    pointsToPaint[pt] = points[pt][0];
   }
   for (int skip = 1; skip < maxx<<1; skip = skip + 2)
                           pointsToPaint[skip] = pointsToPaint[skip] + line;
   myLinePaint.setColor(color);
   canvas.drawLines(pointsToPaint, myLinePaint); / new color
  }

 }

обновление: заменил drawLines () на drawPoint () в цикле, но все равно нет радости

    for (int p = 0; p<pointsToPaint.length; p = p + 2) {
      Log.i(DEBUG_TAG, "x " + pointsToPaint[p] + " y " + pointsToPaint[p+1]);
      canvas.drawPoint(pointsToPaint[p], pointsToPaint[p+1], myLinePaint);
    }
///         canvas.drawLines(pointsToPaint, myLinePaint);

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Я пытался писать из onCreate() и onStart(). Вид и его холст фактически никогда не отображаются в первый раз до конца onStart().

0 голосов
/ 11 марта 2010

Разве вы не предполагаете вызывать аннулирование (например, просмотр карты), чтобы принудительно перезагрузить представление?

YourView.invalidate () (или, возможно, postInvalidate (), в зависимости от того, где вы находитесь: основной или нет) вот деталь

...