Android View.onDraw () всегда имеет чистый холст - PullRequest
16 голосов
/ 11 марта 2010

Я пытаюсь нарисовать анимацию. Для этого я расширил View и переопределил метод onDraw (). Я ожидаю, что каждый раз, когда вызывается onDraw (), холст будет в том состоянии, в котором я его оставил, и я мог выбрать очистить его или просто нарисовать его части (так я работал, когда использовал SurfaceView ) но каждый раз холст возвращается уже очищенным. Есть ли способ, которым я не могу очистить его? Или, может быть, сохранить предыдущее состояние в растровое изображение, чтобы я мог просто нарисовать это растровое изображение, а затем нарисовать поверх него?

Ответы [ 3 ]

28 голосов
/ 11 марта 2010

Я не уверен, есть ли способ или нет. Но для своих пользовательских представлений я либо перерисовываю все каждый раз, когда вызывается onDraw (), либо рисую растровое изображение, а затем рисую растровое изображение на холсте (как вы предложили в своем вопросе).

Вот как я это делаю

class A extends View {

    private Canvas canvas;
    private Bitmap bitmap;

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if (bitmap != null) {
            bitmap .recycle();
        }
        canvas= new Canvas();
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvas.setBitmap(bitmap);
    }
    public void destroy() {
        if (bitmap != null) {
            bitmap.recycle();
        }
    }
    public void onDraw(Canvas c) {
      //draw onto the canvas if needed (maybe only the parts of animation that changed)
      canvas.drawRect(0,0,10,10,paint);

      //draw the bitmap to the real canvas c
      c.drawBitmap(bitmap, 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
    }
}
1 голос
/ 11 марта 2010

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

0 голосов
/ 01 апреля 2010

Ваши ожидания не соответствуют действительности :) Холст будет не таким, каким вы его оставили, а вместо этого пустым. Вы можете создать ArrayList объектов для рисования (canvas.drawCircle (), canvas.drawBitmap () и т. Д.), А затем выполнить итерацию ArrayList в OnDraw (). Я новичок в графическом программировании, но я использовал это в небольшом масштабе. Может быть, есть гораздо лучший способ.

...