Azulejo de un mapa de bits en SurfaceView Canvas

Tengo problemas para crear un Bitmap . Quiero tener el Bitmap dibujado a las coordenadas definidas en una Array 2D.

Me gustaría poder dibujar digamos "hierba" a ciertas coordenadas, y "agua, etc." a otras coordenadas.

He pasado días tratando de entender esto, y apreciaría muchísimo cualquier discernimiento. Sólo puedo obtener el Canvas para dibujar 1 "hierba" Bitmap , Así que siento que tengo un error en mi para el bucle. He mirado aquí y aquí , entre muchos otros, y no quiero que todos los azulejos sean iguales. Aquí está mi código:

MapLoader.java

 public class MapLoader extends SurfaceView implements SurfaceHolder.Callback, Runnable { SurfaceHolder holder; Thread thread; Bitmap grass = BitmapFactory.decodeResource(getResources(), R.drawable.grass); boolean running = false; int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } }; public MapLoader(Context context) { super(context); holder = getHolder(); holder.addCallback(this); } public MapLoader(Context context, AttributeSet attrs) { super(context, attrs); holder = getHolder(); holder.addCallback(this); } public MapLoader(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); holder = getHolder(); holder.addCallback(this); } public void pause() { running = false; while (running) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } break; } thread = null; } public void resume() { running = true; thread = new Thread(this); thread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { running = true; thread = new Thread(this); thread.start(); } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas c = holder.lockCanvas(); draw(c); holder.unlockCanvasAndPost(c); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } @Override public void run() { while (running == true) { // performs drawing to the canvas if (!holder.getSurface().isValid()) { continue; } Canvas c = holder.lockCanvas(); int x = 0; int y = 0; for (x = 0; x < grassCoords.length; x += grass.getWidth()) { for (y = 0; y < grassCoords.length; y += grass.getHeight()) { c.drawBitmap(grass, x, y, null); } } holder.unlockCanvasAndPost(c); } } } 

ActivityClass.java

 public class Test extends Activity { MapLoader mapLoader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mapLoader = new MapLoader(this); setContentView(mapLoader); } } 

Cualquier ayuda o sugerencias (incluso un enlace a un método eficaz) sería muy apreciado!

Gracias,

Mate

2 Solutions collect form web for “Azulejo de un mapa de bits en SurfaceView Canvas”

No es fácil entender lo que usted está tratando de hacer …

¿Cómo se codifican las coordenadas en esa matriz grassCoords ? Como su forma actual tiene 5x5 elementos.

 int[][] grassCoords = new int[][] { { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 }, { 0, 16, 32, 48, 64 } }; 

Dado que tiene grass en su nombre Supongo que desea dibujar sólo hierba, entonces se podría definir como este

 int[][] grassCoords = new int[][] { {0, 0}, {16, 16}, {32, 32} }; 

Por encima de cada elemento como {0, 0} sería una coordenada única para un mosaico de hierba.

La segunda edición es con su lazo, usted no lee ningunos datos de grassCoords excepto longitud de los arrays y cuando usted incrementa el índice usted lo incrementa con grass.getWidth() que realmente no tiene sentido.

  int x = 0; int y = 0; for (x = 0; x < grassCoords.length; x += grass.getWidth()) { for (y = 0; y < grassCoords.length; y += grass.getHeight()) { c.drawBitmap(grass, x, y, null); } } 

Debería iterar la matriz correctamente y extraer los datos de ella.

  int x = 0; for (x = 0; x < grassCoords.length; x++) { c.drawBitmap(grass, grassCoords[x][0], grassCoords[x][1], null); } 

Si fuera tú, estudiaría partes relacionadas del tutorial de Java al menos una vez.

 for (x = 0; x < grassCoords.length; x += grass.getWidth()) { for (y = 0; y < grassCoords.length; y += grass.getHeight()) { c.drawBitmap(grass, x, y, null); } } 

La razón de que sólo dibuja una vez es este poco aquí. grassCoords.length es 5 . Cuando se agrega el ancho de hierba a x después del primer sorteo, se pasa de 5, y el bucle termina. Debe utilizar una variable independiente para los dos. Lo mismo para y . Hay otros problemas con esto, como señala auselen, pero esta es la razón por la que sólo dibuja una vez para empezar.

Sin embargo, puede acabar con la matriz de coordenadas por completo si desea azulejar sin problemas un rectángulo con un mapa de bits. Usted ni siquiera necesita saber cuántos azulejos de ancho / alto que es. Esto es especialmente útil si está usando una capa base de hierba debajo de otros azulejos, si está tejiendo un patrón para una imagen de fondo, etc. Podría hacer eso así:

 for(int x = startX; x < endX; x += grass.getWidth()){ for(int y = startY; y < endY; y += grass.getHeight()){ c.drawBitmap(grass, x, y, null); } } 

Recuerde, si sólo desea llenar con los cuadros a intervalos regulares, no hay necesidad de definir las coordenadas. Todos serán múltiples, por lo que la definición de una matriz de coordenadas en absoluto no tiene mucho sentido. Basta con considerar cada punto de la baldosa como un punto de la cuadrícula y multiplicar por la altura / ancho de la baldosa.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.