Подтвердить что ты не робот

Android View.onDraw() всегда имеет чистый холст

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

4b9b3361

Ответ 1

Я не уверен, есть ли способ или нет. Но для моих пользовательских представлений я либо перерисовываю все каждый раз, когда вызывается 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);
    }
}

Ответ 2

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

Ответ 3

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