2017-09-13 3 views
0

J'essaie d'ajouter des points à la Path et la ligne de dessin entre eux, mais rien n'apparaît.Android. Toile. Dinamiquement ajouter le point de chemin

J'ai vue personnalisée:

public class BreakDownBar extends View { 
private List<Point> points = new ArrayList<>(); 
private Path path = new Path(); 
private Paint p = new Paint(); 

public BreakDownBar(Context context) { 
    super(context); 
} 

public BreakDownBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    p.setStrokeWidth(5); 
    p.setStyle(Paint.Style.STROKE); 
} 

public void addPoint(Point point) { 
    points.add(point); 
    path.rewind(); 
    reDraw(); 
} 

public void startPoint(Point point) { 
    points.add(point); 
} 

private void reDraw() { 
    Canvas canvas = new Canvas(); 
    path.moveTo(points.getFirst().getX(), points.getFirst().getY()); 
    for (int i = 1; i < points.size(); i++) { 
     path.lineTo(points.get(i).getX(), points.get(i).getY()); 
    } 


    canvas.drawPath(path, p); 
    canvas.drawColor(Color.BLACK); 
    draw(canvas); 
    invalidate(); 
} 

}

point class:

public class Point { 
private float x, y; 

...getters and setters 
} 

Tout en ajoutant de nouveaux points au List je peux voir penser le résultat attendu dans le journal, mais rien ne se passe à l'écran. Ce qui m'a manqué de faire apparaître la ligne sur l'écran?

Répondre

1

Vous utilisez une mauvaise logique pour dessiner la ligne, si vous appelez invalidate() vous demandera un appel à draw() et cela va réinitialiser votre toile.

Essayez avec cette version de votre classe:

public class BreakDownBar extends View { 
    private List<Point> points = new ArrayList<>(); 
    private Path path = new Path(); 
    private Paint p = new Paint(); 

    public BreakDownBar(Context context) { 
     super(context); 
     p.setStrokeWidth(5); 
     p.setStyle(Paint.Style.STROKE); 
     p.setColor(Color.BLACK); 
    } 

    public void addPoint(Point point) { 
     points.add(point); 
     //this will request a call to draw(canvas) method 
     invalidate(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 
     //move to the first point in the list 
     path.moveTo(points.get(0).getX(), points.get(0).getY()); 
     for (int i = 1; i < points.size(); i++) { 
      path.lineTo(points.get(i).getX(), points.get(i).getY()); 
     } 
     canvas.drawPath(path, p); 
    } 
} 

Ensuite, dans votre code, vous pouvez simplement faire

BreakDownBar bar = new BreakDownBar(context); 
bar.addPoint(new Point(100f, 200f)) 
bar.addPoint(new Point(200f, 300f)) 
bar.addPoint(new Point(400f, 200f)) 

Permettez-moi de savoir si cela fonctionne pour vous.

+1

Cool, merci pour l'explication! –

+0

merci, bonne chance :) – MatPag