有人能解釋我爲什麼地球上的這段代碼不畫每個對象嗎?當使用很多路徑和繪製對象時,Android畫布會被清理
public class A extends View {
private Paint paint = new Paint();
private Path path = new Path();
ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>();
public A(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
for (Pair<Path, Paint> p : paths) {
canvas.drawPath(p.first, p.second);
}
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(3f);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int color = Color.rgb(new Random().nextInt(255),
new Random().nextInt(255),
new Random().nextInt(255));
paint.setColor(color);
path.reset(); //new stroke, get old one erased
int historySize = event.getHistorySize();
for (int i = 0; i > historySize; i++) {
path.moveTo(eventX, eventY);
}
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
return true;
case MotionEvent.ACTION_UP:
path.lineTo(eventX, eventY);
// End of stroke, add this to the collection
paths.add(new Pair<Path, Paint>(path, paint));
break;
default:
break;
}
// Schedules a repaint.
invalidate();
return true;
}
}
我趕上與每次的onTouchEvent招我創建存儲在一對一個不同的路徑/油漆ojects。可悲的是,在我的OnDraw中,當我嘗試繪製它們時,它全部失敗。 我讀過一些主題,但沒有找到正確的答案。每次有人建議創建和工作在位圖中並將其繪製到屏幕上,但我想避免此解決方案。
感謝您的幫助!
的問題是,你總是使用相同的'Path'和'Paint'對象。當'MotionEvent.ACTION_DOWN'被觸發時,你應該創建新的'Path'和'Paint'。 – 2013-03-10 08:35:03
vmironov,你是我的英雄!我一直在這個問題上停留了近兩天!我已經添加了paint = new Pain();和path = new Path();在MotionEvent.ACTION_DOWN上,現在它工作。那麼我雖然一切都被複制在Java中,沒有引用,所以我認爲我的對象中的對象每次都是不同的...謝謝! – MrAurelien 2013-03-10 11:18:48
這很好,你得到它的工作!我已經發布了我的評論作爲答案,所以你可以[接受](http://stackoverflow.com/faq#howtoask)它。 – 2013-03-10 11:41:41