Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top