Dibujo con los dedos

Encontré este pequeño código de ejemplo, para dibujar con tu dedo:
Http://marakana.com/tutorials/android/2d-graphics-example.html

He aquí algunos de los códigos relevantes:

List<Point> points = new ArrayList<Point>(); @Override public void onDraw(Canvas canvas) { for (Point point : points) { canvas.drawCircle(point.x, point.y, 5, paint); } } public boolean onTouch(View view, MotionEvent event) { Point point = new Point(); point.x = event.getX(); point.y = event.getY(); points.add(point); invalidate(); Log.d(TAG, "point: " + point); return true; } 

Yo estaba mirando a través de él, y vi que están agregando puntos a un ArrayList, a continuación, el bucle a través de la ArrayList, esto no parece que es un enfoque muy optimizado para esto. ¿Existe un enfoque mejor o es un buen enfoque?

Después de probar mi Samsung GS3, coloreé toda la pantalla con un tamaño de círculo de 20, y cuanto más cerca estaba de todo el color, más lento tardaba en dibujar, y luego los círculos se estaban espaciando.

No, esto tiene sentido en este ejemplo.

Él recorre todos los puntos que quiere dibujar. Esto significa que añade cada punto a la matriz, por lo que puede recorrer todos los objetos a la vez.

Usted verá a menudo esto en programación del juego.


Esto también es muy ampliable.

  1. Puedes agregar tantos puntos como quieras
  2. Apoya el polimorfismo
  3. No es necesario realizar variables para varios puntos> Menos código

En primer lugar, utilice el trazo (no los círculos) para dibujar la línea. Segundo, aproximado. He aquí un resumen:

  1. Cambie la Paint para usar un trazo con width=5 . Eso reduce la necesidad de dibujar tantos círculos.
  2. Escoja un umbral, por ejemplo 3px después de lo cual agregará un punto en onTouch() .

     if (Math.abs(previousX - event.getX()) < THRESHOLD && Math.abs(previousY - event.getY()) < THRESHOLD) { return; } previousX = event.getX(); previousY = event.getY(); // drawing update goes here 

    Esto debería reducir el número de puntos (imperceptibles).

  3. Utilice la clase Picture o Path para dibujar la línea y usar Canvas.drawPath() o Canvas.drawPicture() . Esto, especialmente para un gran número de puntos, acelerará realmente el dibujo ya que todos los comandos de dibujo se pasarán a la función de dibujo interno en una llamada.

  4. Simplifique la forma cuando lo necesite. Por ejemplo, puede eliminar los puntos más antiguos (que sería un caso perfecto para utilizar un búfer circular ), utilizar el algoritmo Ramer-Douglas-Peucker que es bastante fácil de implementar, da buenos resultados y tiene complejidad de O(nlogn) .

  • Cómo obtener los valores adecuados de monitor de frecuencia cardíaca Polar
  • Se pierde la biblioteca del sistema JRE de Android (java.awt. *)
  • ¿Cómo insertar valores en matriz bidimensional de forma programática?
  • Convertir de String a BigDecimal para hacer matemáticas en moneda
  • Refrescar las vistas de las preferencias cuando se utiliza PreferenceActivity
  • Algunos objetos parcelables reunidos en un intento / paquete podrían interferir y comprometer la lectura de Intención / Bundle?
  • Establecer la imagen de ImageView desde el path de archivos. BitmapFactory.decodeFile, BitmapFactory.decodeStream o Drawable.fromFile?
  • Android studio logcat no funciona
  • ¿Por qué FileOutputStream lanzar FileNotFoundException?
  • GetAvailableBlocksLong () * getBlockSizeLong () VS getAvailableBytes ()
  • Android ListView: Cómo agregar una fila con un botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.