Bitmapshader y canvas.scaling android
¿Alguien tiene una pista o explicación para el siguiente problema? Dibujo un camino con un bitmapshader. Cuando el lienzo no está escalado, se ve bien (primera imagen). Cuando hago escala en (acercamiento) el bitmapshader no es escalado y se ve muy feo. He intentado varias cosas con la recreación de la bitmapshader después de acercar, pero no tuvo éxito 🙁 ¿Alguien tiene una pista?
No Scaling se ve bien:
- Dibujar línea discontinua en Android mediante programación
- Cómo llenar el color en la imagen en el área en particular?
- Android: ¿qué hace esta bandera Paint: DEV_KERN_TEXT_FLAG?
- Cómo calcular el porcentaje de área borrada de un mapa de bits en android?
- Android: colorea debajo del gráfico de líneas
Cuando la escala que se ve feo:
Código:
canvas.scale(scalex, scaley); canvas.translate(itranslatex, itranslatey); fillBMP = makePatternCross(fscalex, 1, Color.GREEN/*,fscalex,fscaley*/); fillBMPshader = new BitmapShader(fillBMP, BitmapShader.TileMode.REPEAT, BitmapShader.TileMode.REPEAT); paintshader = new Paint(); paintshader.setShader(fillBMPshader); canvas.drawPath(cpath.path, paintshader); private static Bitmap makePatternCross(float fSize, float fStrokewith,int iColor) { Log.v("Create Patter makePatternCross","makePatternCross"); float fBitmapSizeOrig = 10; fBitmapSizeOrig=fBitmapSizeOrig*fSize; Bitmap bm = Bitmap.createBitmap((int)fBitmapSizeOrig,(int) fBitmapSizeOrig,Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bm); //c.scale(200, 200); c.drawColor(Color.WHITE); Paint p = new Paint(); p.setColor(iColor); //p.setStrokeWidth(iStrokewith); p.setStrokeWidth(fStrokewith/fSize); p.setStrokeWidth((float) 0.000001); c.drawLine(0, 0, fBitmapSizeOrig, fBitmapSizeOrig, p); c.drawLine(0, fBitmapSizeOrig, fBitmapSizeOrig, 0, p); if (fSize != 1) { int iNewSize = (int) (( fBitmapSizeOrig) * fSize); bm = Bitmap.createScaledBitmap(bm, iNewSize, iNewSize, false); } int width = bm.getWidth(); int height = bm.getHeight(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (bm.getPixel(x, y) == Color.WHITE) { bm.setPixel(x, y, Color.TRANSPARENT); } else { // bm.setPixel(x, y, bm.getPixel(x, y)); } } } return bm; }
- Cepillo personalizado de Android
- Color de fondo de relleno de lienzo de Android (aplicación de lona)
- Captura de pantalla
- Android conjunto de la fuente personalizada a una pintura
- Cómo obtener el ancho del texto cuando el ajuste de varios spannable
- Android: Medir la altura del texto en una lona
- ¿Cómo dibujo una línea blanca semitransparente?
- Patrón de relleno en Imagen en Android
No estoy seguro exactamente si esto es lo que buscas. Pero si utiliza una matriz para escalar el mapa de bits, conserva más calidad que la escala normal.
Matrix matrix = new Matrix(); matrix.postScale(desiredScale, desiredScale); Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0, sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true);
También cuando va de una resolución menor a una más alta puede probar esto también:
Options options = new BitmapFactory.Options(); options.inScaled = false; Bitmap source = BitmapFactory.decodeResource(a.getResources(), path, options);
- La aplicación de Android no funciona en China
- Android – evitar copiar / pegar edittext y pulsar dos veces todo