Вопрос

Я обдумываю альтернативы того, как прокручивать "бесконечный" масштабируемый элемент управления в Android.Простая идея состоит в том, чтобы перерисовывать весь вид при каждом движении прокрутки, но почему-то это не кажется правильным способом.Можно нарисовать содержимое заранее, но я понятия не имею, насколько широким я должен сделать представление в первую очередь, и что происходит, когда пользователь прокручивает его до конца?Я думаю, мне нужно расширить обзор в этом направлении.

Должен ли я перейти к программному добавлению (и удалению) фрагментов представления в линейный макет?Было бы здорово услышать, какой опыт имеется в отношении рисования такого рода пользовательских элементов управления с длинной прокруткой.

Спасибо /Эрик

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

Решение

если вы работаете со списком / сеткой или с чем-либо, что использует адаптер для передачи данных, вы можете использовать самый превосходный класс, написанный CommonsWare и доступный здесь:

http://github.com/commonsguy/cwac-endless

это было было специально для этой цели

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

используйте закадровый буфер размером с ваш элемент управления.

сначала сделайте это простым способом.Нарисуйте весь экранный буфер прокрученным в правильное положение.Когда будете готовы, выведите его на реальный экран.

Если это происходит слишком медленно, попробуйте оптимизировать его, не перерисовывая весь экранный буфер целиком, а сделав вертикальное разделение:(Я говорю здесь сейчас только о горизонтальном перемещении прокрутки, чтобы упростить понимание концепции.Но этот метод применим и к 8-полосной прокрутке)

это несколько сложно реализовать (вот почему я сначала предложил простой подход), но попробуйте представить бумагу с нанесенным на нее рисунком, а левую сторону вы оборачиваете и приклеиваете к правой стороне (так у вас получится трубочка).Таким образом, вы можете прокручивать бумагу бесконечно (вращая тубус вокруг оси y).

аналогичным образом вы можете сделать то же самое с закадровым буфером.Подготовьте закадровый буфер, нарисовав на нем все содержимое.

теперь, чтобы прокрутить вправо, вы фактически разделяете закадровый буфер на 2 (с помощью этого вертикального разделения (точно так же, как бумага в примере, где был клей)).предположим, вы прокручиваете на 10 пикселей вправо, что вы делаете, это:

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

прежде чем вы сделаете это, перерисуйте ТОЛЬКО те пиксели, которые должны были быть изменены (в данном случае 10 пикселей, поскольку мы прокрутили 10 пикселей).Все остальные пиксели по-прежнему идентичны и не нуждаются в перерисовке.

Вам придется самому нарисовать это на бумаге, чтобы по-настоящему понять.Это довольно распространенный прием при разработке игр на платформах, где ресурсы ограничены (мобильные телефоны и т.д.).

p.s.прокрутка во всех направлениях может быть достигнута точно таким же образом (хотя сделать это правильно еще сложнее) ;^)

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

 private void drawEndlessBackground(Canvas canvas, float left, float top) {

    float modLeft = left % screenWidth;

    canvas.drawBitmap(backgroundImage, modLeft, top, null);

    if (left < 0) {

        canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);

    } else {

        canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);

    }



}

как насчет в формате XML?private void drawEndlessBackground (холст canvas, плавающий слева, плавающий сверху) {

float modLeft = left % screenWidth;

canvas.drawBitmap(backgroundImage, modLeft, top, null);

if (left < 0) {

    canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);

} else {

    canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);

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