es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo llenar de color solamente el icono en el lienzo, sin el fondo en Android Studio.

Quiero cambiar el color de mi archivo PNG, quiero llenarlo con color, así que pensé en crear un mapa de bits a partir del PNG, colocarlo en un lienzo y dibujar el lienzo, pero está dibujando todo el lienzo, como se muestra en la imagen, por lo que mis iconos quedan completamente cubiertos.

Este es mi código:

private fun testResizeImg(imgRes: Int): BitmapDescriptor {
var bm = BitmapFactory.decodeResource(resources, imgRes)
bm = Bitmap.createScaledBitmap(bm, (bm.width * 0.1).toInt(), (bm.height * 0.1).toInt(), true)
val canvas = Canvas(bm)
val paint = Paint()
paint.color = Color.BLUE
canvas.drawPaint(paint)
return BitmapDescriptorFactory.fromBitmap(bm)
}

¿Cuál es el mejor enfoque para hacer esto? Tengo un PNG y quiero colorearlo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Existen varias formas de cambiar el color de un archivo png y rellenarlo de color. Un enfoque es utilizar un drawable con un color sólido como fondo, y establecer el png como imagen delantero. Aquí hay un ejemplo de código:

    En tu archivo xml:

    <relativelayout android:id="@+id/relLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/my_background">
    
        <imageview android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/my_png"></imageview>
    
    </relativelayout>
    

    En tu actividad:

    val imageView = findViewById<imageview>(R.id.imageView)
    val color = ContextCompat.getColor(this, R.color.my_color)
    imageView.setColorFilter(color, PorterDuff.Mode.SRC_IN)
    

    Este código establece un drawable con un color sólido como fondo de un RelativeLayout, y luego establece el png como imagen delantera. El método setColorFilter se utiliza para cambiar el color del png, utilizando el modo de fusión PorterDuff.Mode.SRC_IN para rellenar el png con el color deseado.

    Otro enfoque es crear un bitmap a partir del png y dibujarlo en un lienzo, como ya has intentado. Para evitar cubrir todo el lienzo, puedes utilizar un camino de recorte para limitar el área que se va a pintar. Aquí hay un ejemplo de código:

    private fun testResizeImg(imgRes: Int): BitmapDescriptor {
        val bm = BitmapFactory.decodeResource(resources, imgRes)
        val scaled = Bitmap.createScaledBitmap(bm, (bm.width * 0.1).toInt(), (bm.height * 0.1).toInt(), true)
        val bitmap = Bitmap.createBitmap(scaled.width, scaled.height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(bitmap)
        val paint = Paint()
        val path = Path()
        val rect = RectF(0f, 0f, scaled.width.toFloat(), scaled.height.toFloat())
        val radius = 50f
        path.addRoundRect(rect, radius, radius, Path.Direction.CW)
        canvas.clipPath(path)
        canvas.drawBitmap(scaled, 0f, 0f, paint)
        return BitmapDescriptorFactory.fromBitmap(bitmap)
    }
    

    Este código crea un bitmap a partir del png, lo escala hacia abajo y crea un nuevo bitmap con el mismo tamaño y configuración. Se crea un lienzo a partir del nuevo bitmap y se crea un camino con un rectángulo redondeado que se utilizará como camino de recorte. El lienzo se recorta con el camino y el bitmap escalado se dibuja en el lienzo con el color deseado utilizando el método drawBitmap.

    Estos son solo dos enfoques para lograr el resultado deseado, y puede haber otras formas de hacerlo dependiendo de los requisitos específicos de tu proyecto.

Comments are closed.