Сохранение холста в onDraw();

Я пытаюсь сохранить объект Canvas в методе onDraw(). Это связано с тем, что я использую цикл foreach в методе onDraw, что приводит к: canvas.DrawText (textitem, x, y, textpaint);
(мне нужно сделать это, потому что я рисую текст вокруг замаскированной области)

то, что я пытаюсь сейчас, это:

@Override
public void onDraw(Canvas canvas)
{
if (hasrun = false)
        {
            for(CustomTextViewDrawItem item : drawItemList)
            {
                canvas.drawText(item.Text, item.X, item.Y, textPaint);
            }

            if (eLabel.backgroundGradient != null)
            {
                canvas.drawPath(path, fillPaint);
            }
            canvas.save();
            savedCanvas = canvas ;
        }
        else 
        {
            canvas = savedCanvas; 
        }

        hasrun = true; 
        super.onDraw(canvas);
}

при отладке я вижу, что это выглядит нормально, но выходит пустым. что было бы лучшим способом заставить это работать?


person ron    schedule 16.09.2011    source источник
comment
Что вы ожидаете от функции save()? Возможно, вы неправильно понимаете, как это работает.   -  person Pointer Null    schedule 16.09.2011
comment
да мыши правы, я думаю, вы неправильно понимаете canvas.save().   -  person user370305    schedule 16.09.2011
comment
Что ты пытаешься сделать? пожалуйста, опубликуйте место, где вы добавляете Canvas к своей деятельности, и как вы объявляете два поля холста.   -  person Sanjay Manohar    schedule 16.09.2011
comment
да, я неправильно понял спасительную часть. поначалу казалось логичным. следует изучить это. Сейчас работает по методу Судара. Санджай: это часть пользовательского класса, расширяющего текстовое представление. который отлично работает, но я пытаюсь улучшить производительность и уменьшить выделение. сохранение растрового изображения повышает производительность, но требует большого объема памяти.   -  person ron    schedule 16.09.2011


Ответы (2)


Может из-за этого:

if (hasrun = false)

Я думаю, вы намереваетесь сделать это вместо этого:

if (hasrun == false)
person Caner    schedule 16.09.2011
comment
Вот почему я всегда пишу if ( false == hasrun) =) - person Andrey Starodubtsev; 05.03.2012

Вы можете попытаться сохранить растровое изображение: (я думаю, что лучше вызвать super.onDraw(canvas); в начале метода, потому что ваш рисунок, связанный с видом, будет сверху)


@Override
public void onDraw(Canvas canvas)
{
        super.onDraw(canvas);
        if (savedBitmap==null){
            savedBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888);
            Canvas canvasToSave = new Canvas(savedBitmap)
            for(CustomTextViewDrawItem item : drawItemList){
                canvasToSave.drawText(item.Text, item.X, item.Y, textPaint);
            }

            if (eLabel.backgroundGradient != null){
                canvasToSave.drawPath(path, fillPaint);
            }
        }
        canvas.drawBitmap(savedBitmap, 0, 0, new Paint());
}

person Sudar Nimalan    schedule 16.09.2011
comment
Спасибо, этот метод, кажется, работает нормально. однако это вызывает новые проблемы. OutofMemoryError, если быть точным. Внешнее выделение слишком велико для этого процесса. так что я думаю, что это путь ко многим распределениям растровых изображений. Кроме того, немного странно, когда я помещаю super.Ondraw(canvas) в начало, фон рисуется просто отлично, но текст не будет? установка в конце работает как задумано ... почему это может быть ? - person ron; 16.09.2011
comment
вы все еще используете свой код hasrun = false, тогда он должен быть hasrun == false - person Sudar Nimalan; 16.09.2011
comment
изменение Config.ARGB_8888 на RGB_565 может сэкономить место - person Sudar Nimalan; 16.09.2011