Как предотвратить стирание холста Android каждый раз, когда я вызываю onDraw()?

Я пытаюсь сделать простое приложение для рисования, но каждый раз, когда я вызываю onDraw, он стирает то, что у меня было раньше. В моем случае я делаю следующее (где точка — это класс с целыми числами x и y, а «точки» — это список точек):

        Paint paint = new Paint();
        int c = getPaintFromActivityClass();
        paint.setColor(c);
        Path path = new Path();
        boolean first = true;
        for(Point point : points){
            if(first){
                first = false;
                path.moveTo(point.x, point.y);
            }
            else{
                path.lineTo(point.x, point.y);
            }
        }
        canvas.drawPath(path, paint);

Я пытался каждый раз добавлять «старый» путь к новому пути, по существу объединяя пути друг с другом, и это создавало отдельные (не связанные) пути. Однако в onDraw я также устанавливаю цвет краски, который изменяется в другом представлении. Когда я добавил пути друг к другу, изменение цвета изменило цвет всех путей.


person mergesort    schedule 17.04.2012    source источник
comment
Нарисуйте путь на растровом изображении, а затем нарисуйте это растровое изображение   -  person Selvin    schedule 18.04.2012
comment
@Selvin Я думал именно об этом, но как мне нарисовать путь на растровом изображении?   -  person mergesort    schedule 18.04.2012
comment
Быстрый поиск дал мне это stackoverflow.com/questions/4013725/   -  person Selvin    schedule 18.04.2012
comment
где вы используете invalidate()?   -  person stefan    schedule 18.04.2012


Ответы (2)


Другой вариант — создать ArrayList или Vector путей и цветов и сохранить их, а затем изменить метод onDraw. Добавьте их в класс:

ArrayList<Path> paths;
ArrayList<int> colors;

В onTouch вы должны создать и добавить путь и цвет к каждому ArrayList, а затем в ondraw пройти по пути... все еще вызывая недействительность в вашем методе ontouch. Чтобы начать сначала, вы очистите ArrayList

Paint paint = new Paint();
for(int i =0 : i < Paths.size() ;i++){ 
paint.setColor(colors.get(i));
canvas.drawPath(paths.get(i), paint);
}

Если вы создаете кучу растровых изображений, убедитесь, что вы перерабатываете их в нужное время. Концепция в этом ответе может быть лучше, если вы хотите отслеживать историю, было бы легко сделать простую кнопку «отменить» и просто вывести последнюю запись. Вы можете улучшить это, создав свой собственный класс для отслеживания цвета и путей, и тогда у вас будет только один ArrayList вашего пользовательского класса.

person Nick    schedule 17.04.2012

Вы звоните super.onDraw(canvas)? Если это так, сделайте весь свой рисунок после этого, иначе супервызов перерисует весь вид.

Если вы используете onTouch, я также предполагаю, что вы выполняете панорамирование и/или масштабирование. Если это так, то также используйте canvas.save() перед тем, как рисовать, и canvas.restore() после. Холст Android похож на холст HTML5, и это описание лучше, чем документы Android (как и любая другая тематическая страница программирования в Интернете;))

https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Transformations

person Simon    schedule 17.04.2012
comment
Нет панорамирования или масштабирования. Также я не вызываю super.onDraw(canvas). Я все еще не могу заставить его работать. Я не уверен, где установить растровое изображение и где его нарисовать. - person mergesort; 18.04.2012
comment
Хорошо, обо всем по порядку. Как бы вы этого ни достигли, вы должны рисовать все в onDraw. Это не аддитивно, поэтому вам нужно либо объединять вещи, как вы говорите, либо сохранять предыдущие розыгрыши. Одним из шаблонов для этого является отрисовка последнего кадра (например, ImageView.getBackgroundDrawable(), рисование на нем нового материала, а затем рисование растрового изображения на холсте. Помогает ли это... tutorialforandroid.com/2009/06/ - person Simon; 18.04.2012
comment
Спасибо за комментарий. Понимание того, что вы должны перерисовывать все в onDraw, сделало все более понятным. Я полностью выполнил то, что мне нужно было сделать. Спасибо! - person mergesort; 18.04.2012