Pregunta

Estoy barajando las alternativas sobre cómo recorrer una "infinita", en forma de escamas, el control de androide. La idea es sencilla para redibujar toda la vista en cada movimiento de desplazamiento, pero de alguna manera no parece ser la forma correcta. Es posible extraer el contenido de antemano, pero no tengo ni idea de cómo amplia que debería hacer la vista, en primer lugar, y lo que sucede cuando el usuario se desplaza hasta el final de la vista? Creo que es necesario extender la vista hacia esa dirección.

¿Debo ir hacia programáticamente añadir (y eliminar) trozos de vista de un diseño lineal? Sería muy bueno para escuchar lo que las experiencias están ahí fuera con respecto a la elaboración de este tipo de control personalizado a largo desplazamiento.

Gracias / Erik

¿Fue útil?

Solución

si se está trabajando con la lista / rejilla o cualquier cosa que utiliza el adaptador de datos, se puede utilizar una clase más excelente escrito por CommonsWare y disponible aquí:

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

se fue específicamente para este propósito

Otros consejos

utilizar un buffer fuera de pantalla del tamaño de su control.

Al principio hacerlo de la manera sencilla. Dibuje toda la offscreenbuffer desplazado a la posición correcta. Cuando esté listo blit a la pantalla real.

Si esto es demasiado lento, tratar de optimizarlo al no volver a dibujar todo el offscreenbuffer pero haciendo una división vertical:. (Yo sólo estoy hablando de un movimiento de desplazamiento horizontal aquí por ahora para hacer el concepto más fácil de entender, pero esta método se aplica a 8 manera desplazamiento también)

Este es un tanto difícil de poner en práctica (que es por lo que sugirió que el enfoque simple en primer lugar), pero trata de imaginar un papel con el cuadro en él, y el lado izquierdo en que se coloca alrededor y péguelo en el lado derecho (lo que obtener una tubo). De esta manera se puede desplazar el papel de forma indefinida (haciendo girar el tubo alrededor de su eje y).

Del mismo modo se puede hacer lo mismo con el buffer.Prepare fuera de la pantalla del buffer fuera de pantalla dibujando el contenido completo en él.

Ahora que desplazarse a la derecha que, básicamente, dividir el buffer fuera de pantalla en 2 (a través de esta división vertical (al igual que el papel en el ejemplo en el que la cola era)). supongamos que desplazarse 10 píxeles hacia la derecha, lo que se hace es:

  • copiar el lado derecho de la división (que se encuentra en el píxel 10) de píxeles 0 de su control. (Por lo que toda la región a partir de (10, 0) - (anchura - altura) a: (0,0)
  • luego copia el lado izquierdo de la escisión: pixel de 0 a 10 a lo ancho 10 píxeles. así: (0,0) - (10, altura) a (ancho-10, 0)

antes de hacer esto SOLO volver a dibujar los píxeles que han sido alterados para ser (en este caso 10 píxeles ya que desplazamos 10 píxeles). Todos los otros píxeles siguen siendo idénticas y no es necesario volver a dibujar.

Vas a tener que sacar esto hacia fuera en un papel de sí mismo para comprender realmente. Es una técnica muy común con el desarrollo del juego en las plataformas donde los recursos son limitados (teléfonos móviles, etc.).

p.s. desplazarse en todas las direcciones se puede lograr de la misma manera exacta (aunque es aún más difícil conseguir la derecha); ^)

un poco tarde a la fiesta, pero pensé que iba a presentar una forma mucho más simple para ir: sólo tiene la Tamaño_de_la_pantalla o el tamaño de la vista de su formación es en, y luego llama al siguiente código (asumiendo que usted está extendiendo una vista y anulando 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);

    }



}

¿qué hay en XML? drawEndlessBackground private void (Lona, flotador izquierda, arriba del flotador) {

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top