Пользовательский вид onDraw внутри Scrollview

У меня есть пользовательский вид (ширина = 2000) внутри горизонтального прокрутки (ширина = 480). Итак, есть область, которую можно прокручивать.

Когда вызывается onDraw(), грязный прямоугольник (возвращаемый getClipBounds()) возвращает размеры всего вида, поэтому я рисую весь вид, включая невидимую область. Как следствие, когда я прокручиваю, onDraw() больше не вызывается, потому что области, которые становятся видимыми, уже были нарисованы и как-то запоминались.

public void onDraw(Canvas canvas)
{
    canvas.getClipBounds(r); // returns 2000 x 400
}

Это прекрасно работает!!!
Однако мое пользовательское представление может достигать 20 000 или более, и все начинает замедляться. Меня беспокоит то, что кэшированный рисунок использует много памяти. Я не думаю, что рисунок сохраняется как растровое изображение, потому что он уже разбился, так как же сохраняются эти команды рисования (в основном линии и текст)? Есть ли способ указать, что onDraw() должен запрашивать только видимую часть представления, а при прокрутке он продолжает вызывать onDraw()? Или есть какой-то другой подход?

Спасибо!


person Merlevede    schedule 13.03.2014    source источник


Ответы (1)


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

Если представление в ScrollView действительно велико, вы можете отключить аппаратное ускорение для представления.

Мы делаем это, создавая подкласс ScrollView и переопределяя метод onAttachedToWindow() следующим образом:

@Override
protected void onAttachedToWindow()
{
    setLayerType(LAYER_TYPE_SOFTWARE, null);
}
person HHK    schedule 14.06.2014
comment
Вы действительно спасли мой день! Я просматриваю этот ответ на codeitive.com/0yxVVjeeeV/ и это решает мою проблему, когда мое текстовое представление внутри прокрутки всегда вызывает некоторые сбои во время прокрутки. Я ищу в сети, чтобы найти этот ответ здесь, чтобы дать вам голос. Спасибо. - person Surely; 08.05.2015