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").
- LiveWallpaper con SurfaceHolder.lockCanvas (Rect sucio)
- SurfaceHolder.setType está obsoleto ... pero necesario?
- SurfaceHolder.lockCanvas () Devuelve null
- El tamaño de texto de Android en la lona difiere del tamaño de texto en TextView
- Cambiar tamaño de Android personalizado SurfaceView
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
- ¿Es posible grabar vídeo de la cámara a través de un búfer en un archivo?
- Bandas de colores únicamente en Android 4.0+
- Cómo utilizar RenderScript con SurfaceView / View
- LockCanvas () muy lento
- ¿Cómo utilizar mi SurfaceView con main.xml en Android?
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);