2009-10-17 3 views
1

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

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

Благодаря /Erik

+0

Во время моей мысли об этом другой связанный с этим вопрос подошел. Если вы нашли этот вопрос интересен, есть вероятность, что это один может быть интересно, как хорошо :) http://stackoverflow.com/questions/1635699/how-to-synchronize-content-of-one-view-depending-on -scroll-position-in-sibling-sc – SoManyDetails

ответ

1

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

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

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

+0

Это выглядит многообещающе, но я не изучал детали компонента. Демонстрация, похоже, приостанавливается и демонстрирует прогресс в процессе получения дополнительных просмотров. Я бы хотел, чтобы элемент управления выглядел более бесшумным, создавая представления, которые, вероятно, будут прокручиваться на экране немного раньше, чем на самом деле нужны. Вы знаете, возможно ли это с помощью этого компонента. Документация немного краткая. – SoManyDetails

1

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

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

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

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

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

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

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

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

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

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

+0

Спасибо за этот хороший алгоритм. Кажется, что можно адаптировать это, чтобы вести себя так, как хотелось бы, но также, похоже, требует более детального развития, чем компонент, предложенный Reflog. Поэтому я отвечу на этот вопрос. – SoManyDetails

1

немного опоздал на вечеринку, но я полагал, что я хотел бы показать вам гораздо проще путь: вам просто нужен размер экрана или размер вашего фонового изображения, d затем вызовите следующий код (при условии, что вы расширяете представление и переопределяете 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); 

    } 



} 
0

как насчет в XML? частная пустота drawEndlessBackground (холст холст, поплавок слева, поплавок вверху) {

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); 

} 
Смежные вопросы