Dibujar mapas de bits escalados en un SurfaceView – no antialiasing

Lo siento si este tema se ha presentado antes, pero todas mis búsquedas en los grupos web y google no me ayudaron.

Actualmente estoy desarrollando un pequeño juego con el SDK de Android y uso mapas de bits de alta resolución que cambio de tamaño para que coincida con la resolución del dispositivo (dejar que el sistema lo haga por mí no es lo suficientemente "nítido").

Utilizo un SurfaceView, en el que pinto en un paso un lienzo que llena toda la superficie. La pintura utiliza setXfermode (nuevo PorterDuffXfermode (PorterDuff.Mode.SRC_IN)) para permitir el enmascaramiento. De antemano, recupero varios mapas de bits, que se redimensionan a la inicialización con createScaledBitmap () y se ponen en un caché – y aplico los mapas de bits con una pintura en este lienzo, antes de dibujar este lienzo en el SurfaceView.

Mi problema es, cualquiera que sea lo que intento, cualquiera que sea la configuración de pintura que uso (tramado, antialias, etc.), los mapas de bits redimensionados no son antialias y el dibujo presenta bordes irregulares. Lo intenté todo. El único poco éxito que tuve fue usar inSampleSize para acercarme al tamaño de escala deseado y forzar un primer paso de antialiasing, antes de invocar createScaledBitmap en el mapa de bits de alta resolución recuperado, pero no es bastante bonito. Simplemente no puedo permitir que se creen multitud de mapas de bits pre-dimensionados para cada combinación de resolución. Qué me perdí ?

Muchas gracias por adelantado

Primero, cuando cargues el mapa de bits, asegúrate de no perder ninguna calidad de imagen mediante las opciones de configuración de argb_8888:

Options options = new Options(); options.inScaled = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap pic = BitmapFactory.decodeResource(getResources(), R.id.pic, options); 

Al escalar el mapa de bits encienda el filtro:

 pic = Bitmap.createScaledBitmap(pic, screenW, screenH, true); 

Sin embargo, si uno estira la imagen demasiado inevitablemente se degrada en calidad.

Cuando se utiliza la pintura puede mejorar la calidad, pero perder en la velocidad con el encendido ditherig y filtrado:

 Paint paint = new Paint(); paint.setFlags(Paint.DITHER_FLAG); paint.setFilterBitmap(true); 

Por último, la ventana de toda la actividad podría establecerse en argb_4444 en lugar de argb_8888 (OS <2.3). Puede chage esto si instert esta línea antes de setContentView:

 getWindow().setFormat(PixelFormat.RGBA_8888); 

Si se reduce a ella, puede antialias manualmente sin demasiados problemas. Simplemente aplique un simple filtro de paso bajo (algo así como un promedio de NxN) a los datos de píxeles antes de pedir al objeto de mapa de bits que cambie de escala por sí mismo.

Usted puede limpiar el amortiguador de la lona por youself! Tal como sigue:

 canvas.drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.