2010-03-11 6 views
0

J'ai la routine suivante dans une sous-classe de vue:onDraw() a déclenché, mais les résultats ne montrent pas

Il calcule un tableau de points qui composent une ligne, efface alors les lignes précédentes, puis dessine la nouvelle lignes (l'impact fait référence à la largeur en pixels tracée avec plusieurs lignes). La ligne est votre courbe de base de la cloche, serrée ou étirée par la variance et le facteur x.

Malheureusement, rien ne s'affiche à l'écran. Une version précédente avec drawPoint() et aucun tableau n'a fonctionné, et j'ai vérifié que le contenu du tableau est chargé correctement, et je peux voir que mon onDraw() est déclenché.

Des idées pour lesquelles il pourrait ne pas être dessiné? Merci d'avance!

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 
    } 

} 

mise à jour: substitua aux drawLines() avec point de soutirage() dans la boucle, toujours pas de joie

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

Répondre

0

ne sont pas vous que d'appeler invalidate (comme un MapView) pour forcer la vue à recharger?

YourView.invalidate() (ou peut-être postInvalidate(), selon l'endroit où vous êtes: principale sthread ou non) here is the detail

+0

En fait, c'est plus simple que cela. La première commande onDraw() ne se produit jamais avant la fin de onStart(). J'ai été rendu fou par cela parce que j'essayais d'obtenir la largeur et la hauteur de la vue pour initialiser les tableaux de points, et il a absolument refusé de le faire ... jusqu'à après onStart(). J'ai été ébloui par les exemples qui illustrent l'utilisation de onDraw() pour écrire sur le canvas(), mais la lumière s'est enfin levée quand j'ai vu que le premier onDraw() n'arrivait jamais avant. Vous pouvez configurer le canevas sans connaître la taille de la vue) et "dessiner" au contenu de votre coeur, mais il ne sort jamais _rends_ jusqu'à la fin de onStart(). –

1

je tentais d'écrire à l'intérieur onCreate() et onStart(). La vue et son canevas ne sont jamais réellement rendus pour la première fois jusqu'à la fin de onStart().