2017-09-13 38 views
0

我想添加點Path和他們之間的繪製線,但沒有出現。。帆布。 Dinamically添加路徑點

我有自定義視圖:

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

}

class

public class Point { 
private float x, y; 

...getters and setters 
} 

同時增加新點的List我可以看到想在日誌中預期的結果,但屏幕上沒有任何事情發生。

我錯過了什麼讓行顯示在屏幕上?

回答

1

如果您打電話給invalidate(),您正在使用錯誤的邏輯畫線,您將請求致電draw(),這將重置您的畫布。

嘗試使用這個版本的類:

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

然後在你的代碼,你可以簡單地做

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

讓我知道這對你的作品。

+1

很酷,謝謝你的解釋! –

+0

謝謝,祝你好運:) – MatPag