Pergunta

Estou pensando em alternativas sobre como rolar um controle "infinito", semelhante a uma escala, no Android.A ideia simples é redesenhar toda a visualização em cada movimento de rolagem, mas de alguma forma não parece ser a maneira correta.É possível desenhar o conteúdo de antemão, mas não tenho ideia de quão ampla devo tornar a visualização, e o que acontece quando o usuário rola até o final da visualização?Acho que preciso ampliar a visão nessa direção.

Devo adicionar (e remover) programaticamente pedaços de visualização a um layout linear?Seria ótimo ouvir quais experiências existem em relação ao desenho desse tipo de controle personalizado de rolagem longa.

Obrigado /Erik

Foi útil?

Solução

Se você estiver trabalhando com lista/grade ou qualquer coisa que use o adaptador para dados, você pode usar uma classe excelente escrita por Commonsware e disponível aqui:

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

foi especificamente para esse fim

Outras dicas

Use um buffer fora da tela do tamanho do seu controle.

A princípio, faça da maneira simples. Desenhe toda a tela fora da tela rolada para a posição correta. Quando pronto, prendê -lo na tela real.

Se isso for muito lento, tente otimizá -lo por não redesenhando todo o lado fora da tela, mas fazendo uma divisão vertical: (estou falando apenas de um movimento de rolagem horizontal aqui por enquanto para facilitar o conceito. Mas esse método se aplica ao 8 vias rolando também)

É um pouco complicado de implementar (é por isso que sugeri a abordagem simples primeiro), mas tente imaginar um papel com imagem, e o lado esquerdo que você envolve e cola -o no lado direito (para que você obtenha um tubo). Dessa forma, você pode rolar o papel indefinidamente (girando o tubo em torno de seu eixo y).

Da mesma forma, você pode fazer o mesmo com o buffer da tela. Prepare o buffer offselen, desenhando o conteúdo completo nele.

Agora, para rolar para a direita, você basicamente dividiu o tampão fora da tela em 2 (por meio dessa divisão vertical (assim como o papel no exemplo em que estava a cola)). Suponha que você role 10 pixels para a direita, o que você faz é:

  • Copie o lado direito da divisão (localizada no pixel 10) para o pixel 0 do seu controle. (Então toda a região de (10, 0) - (largura - altura) a: (0,0)
  • Em seguida, copie o lado esquerdo da divisão: Pixel 0 a 10 a Pixel Width-10. Então: (0,0)-(10, altura) para (largura-10, 0)

Antes de fazer isso, apenas redesenham os pixels que foram alterados (neste caso, 10 pixels desde que rolamos 10 pixels). Todos os outros pixels ainda são idênticos e não precisam de redesenhos.

Você terá que desenhar isso em um artigo para realmente entendê -lo. É uma técnica bastante comum com o desenvolvimento de jogos em plataformas onde os recursos são limitados (telefones celulares etc.).

PS rolando em todas as direções pode ser alcançado exatamente da mesma maneira (embora seja ainda mais difícil de acertar);^)

Um pouco tarde para a festa, mas achei que te mostraria um caminho mais simples a seguir: você só precisa do screenize ou tamanho da exibição em que seu plano de fundo está e depois chame o seguinte código (assumindo que você está estendendo um visualizar e substituir 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);

    }



}

que tal em XML?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);

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top