Come modificare i colors di un disegno in Android?

Sto lavorando su un'applicazione Android, e ho un disegno che sto caricando da un'image di origine. Su questa image, vorrei convertire tutti i pixel bianchi in un colore diverso, ad esempio blu, quindi memorizzare in cache l'object disegnabile risultante in modo da poterlo utilizzare successivamente.

Quindi per esempio dire che ho un file PNG 20×20 che ha un cerchio bianco al centro e che tutto fuori dal cerchio è trasparente. Qual è il modo migliore per trasformare il blu cerchio bianco e memorizzare i risultati? La risposta cambia se desidero utilizzare quella sorgente per creare diversi nuovi Disegni (ad esempio blu, rosso, verde, arancione, ecc.)?

  • Perché non esiste un metodo di rimozione (int posizione) nel JSONArray di Android?
  • Modificare il colore disegnabile in modo programmato
  • Errore di memory in android a causa della dimensione del mazzo aumentando
  • Voglio rimuovere il divisore sotto la barra di azione
  • La variabile statica Java diventa nullo
  • come aggiungere l'effetto ombra sul disegnabile in android
  • Sto pensando che voglio usare in qualche modo una ColorMatrix, ma non so come.

    17 Solutions collect form web for “Come modificare i colors di un disegno in Android?”

    Penso che tu possa effettivamente usare Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY ) . Ciò avrebbe impostato i pixel bianchi in rosso, ma non credo che influenzerebbe i pixel trasparenti.

    Vedere Drawable # setColorFilter

    Provare a provare questo codice:

     ImageView lineColorCode = (ImageView)convertView.findViewById(R.id.line_color_code); int color = Color.parseColor("#AE6118"); //The color u want lineColorCode.setColorFilter(color); 

    Se si dispone di un disegno che è un colore solido e si desidera modificarlo in un colore solido differnet, è ansible utilizzare un ColorMatrixColorFilter . La trasparenza è conservata.

     int iColor = Color.parseColor(color); int red = (iColor & 0xFF0000) / 0xFFFF; int green = (iColor & 0xFF00) / 0xFF; int blue = iColor & 0xFF; float[] matrix = { 0, 0, 0, 0, red, 0, 0, 0, 0, green, 0, 0, 0, 0, blue, 0, 0, 0, 1, 0 }; ColorFilter colorFilter = new ColorMatrixColorFilter(matrix); drawable.setColorFilter(colorFilter); 

    So che questa domanda è stata una domanda prima di Lollipop, ma vorrei aggiungere un bel modo per farlo su Android 5. +. Si crea un disegnatore xml che fa riferimento all'originale e imposta la tinta su di esso come tale:

     <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_back" android:tint="@color/red_tint"/> 

    Controlla il mio post sul blog per ulteriori informazioni .

    Il nuovo supporto v4 port tinta di nuovo api 4.

    puoi farlo così

     public static Drawable setTint(Drawable d, int color) { Drawable wrappedDrawable = DrawableCompat.wrap(d); DrawableCompat.setTint(wrappedDrawable, color); return wrappedDrawable; } 

    Dovresti farlo per tutte le API:

     Drawable myIcon = getResources().getDrawable( R.drawable.button ); ColorFilter filter = new LightingColorFilter( Color.BLACK, Color.BLACK); myIcon.setColorFilter(filter); 

    Ho potuto farlo con il seguente codice, che è tratto da un'attività (il layout è molto semplice, contenente solo un ImageView e non viene pubblicato qui).

     private static final int[] FROM_COLOR = new int[]{49, 179, 110}; private static final int THRESHOLD = 3; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_colors); ImageView iv = (ImageView) findViewById(R.id.img); Drawable d = getResources().getDrawable(RES); iv.setImageDrawable(adjust(d)); } private Drawable adjust(Drawable d) { int to = Color.RED; //Need to copy to ensure that the bitmap is mutable. Bitmap src = ((BitmapDrawable) d).getBitmap(); Bitmap bitmap = src.copy(Bitmap.Config.ARGB_8888, true); for(int x = 0;x < bitmap.getWidth();x++) for(int y = 0;y < bitmap.getHeight();y++) if(match(bitmap.getPixel(x, y))) bitmap.setPixel(x, y, to); return new BitmapDrawable(bitmap); } private boolean match(int pixel) { //There may be a better way to match, but I wanted to do a comparison ignoring //transparency, so I couldn't just do a direct integer compare. return Math.abs(Color.red(pixel) - FROM_COLOR[0]) < THRESHOLD && Math.abs(Color.green(pixel) - FROM_COLOR[1]) < THRESHOLD && Math.abs(Color.blue(pixel) - FROM_COLOR[2]) < THRESHOLD; } 

    OH MIO DIO! molte delle risposte veramente buone e uso anche ImageView per le icone (nella visualizzazione elenco o nella schermata delle impostazioni). Ma penso che ci sia un modo molto più semplice per farlo a causa di

    Utilizza "tinta" per modificare il sovrapposto colore dell'icona selezionata.

    in xml ho fatto così

    Android: tinta = "@ colore / accent"
    Android: src = "@ drawable / ic_event"

    funziona bene in quanto proveniente da appCompat! Saluti!

    Nella tua attività puoi colorare le tue risorse PNG con un singolo colore:

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myColorTint(); setContentView(R.layout.activity_main); } private void myColorTint() { int tint = Color.parseColor("#0000FF"); // R.color.blue; PorterDuff.Mode mode = PorterDuff.Mode.SRC_ATOP; // add your drawable resources you wish to tint to the drawables arrays... int drawables[] = { R.drawable.ic_action_edit, R.drawable.ic_action_refresh }; for (int id : drawables) { Drawable icon = getResources().getDrawable(id); icon.setColorFilter(tint,mode); } } 

    Ora quando si utilizza il R.drawable. * Dovrebbe essere colorato con la tinta desiderata. Se avete bisogno di colors aggiuntivi allora dovresti essere in grado di .mutare () il disegnatore.

    Ci sono tante soluzioni ma nessuno ha suggerito se il file xml di risorsa di colore ha già colore quindi possiamo scegliere direttamente da lì anche come sotto:

     ImageView imageView = (ImageView) findViewById(R.id.imageview); imageView.setColorFilter(getString(R.color.your_color)); 
     Drawable drawable = DrawableCompat.wrap(drawable); drawable.mutate(); // to not share its state with any other drawable DrawableCompat.setTint(drawable, ContextCompat.getColor(getContext(), R.color.your_color)); 

    Verifica questo codice di esempio " ColorMatrixSample.java "

     /* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.apis.graphics; import com.example.android.apis.R; import android.app.Activity; import android.content.Context; import android.graphics.*; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; public class ColorMatrixSample extends GraphicsActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } private static class SampleView extends View { private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private ColorMatrix mCM = new ColorMatrix(); private Bitmap mBitmap; private float mSaturation; private float mAngle; public SampleView(Context context) { super(context); mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.balloons); } private static void setTranslate(ColorMatrix cm, float dr, float dg, float db, float da) { cm.set(new float[] { 2, 0, 0, 0, dr, 0, 2, 0, 0, dg, 0, 0, 2, 0, db, 0, 0, 0, 1, da }); } private static void setContrast(ColorMatrix cm, float contrast) { float scale = contrast + 1.f; float translate = (-.5f * scale + .5f) * 255.f; cm.set(new float[] { scale, 0, 0, 0, translate, 0, scale, 0, 0, translate, 0, 0, scale, 0, translate, 0, 0, 0, 1, 0 }); } private static void setContrastTranslateOnly(ColorMatrix cm, float contrast) { float scale = contrast + 1.f; float translate = (-.5f * scale + .5f) * 255.f; cm.set(new float[] { 1, 0, 0, 0, translate, 0, 1, 0, 0, translate, 0, 0, 1, 0, translate, 0, 0, 0, 1, 0 }); } private static void setContrastScaleOnly(ColorMatrix cm, float contrast) { float scale = contrast + 1.f; float translate = (-.5f * scale + .5f) * 255.f; cm.set(new float[] { scale, 0, 0, 0, 0, 0, scale, 0, 0, 0, 0, 0, scale, 0, 0, 0, 0, 0, 1, 0 }); } @Override protected void onDraw(Canvas canvas) { Paint paint = mPaint; float x = 20; float y = 20; canvas.drawColor(Color.WHITE); paint.setColorFilter(null); canvas.drawBitmap(mBitmap, x, y, paint); ColorMatrix cm = new ColorMatrix(); mAngle += 2; if (mAngle > 180) { mAngle = 0; } //convert our animated angle [-180...180] to a contrast value of [-1..1] float contrast = mAngle / 180.f; setContrast(cm, contrast); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(mBitmap, x + mBitmap.getWidth() + 10, y, paint); setContrastScaleOnly(cm, contrast); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(mBitmap, x, y + mBitmap.getHeight() + 10, paint); setContrastTranslateOnly(cm, contrast); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(mBitmap, x, y + 2*(mBitmap.getHeight() + 10), paint); invalidate(); } } } 

    La relativa API è disponibile qui :

    Questo funziona con tutto con background:

    Textview, button …

     TextView text = (TextView) View.findViewById(R.id.MyText); text.setBackgroundResource(Icon); text.getBackground().setColorFilter(getResources().getColor(Color), PorterDuff.Mode.SRC_ATOP); 
     view.getDrawable().mutate().setColorFilter(0xff777777, PorterDuff.Mode.MULTIPLY); 

    Grazie a @sabadow

    Questo frammento di codice ha funzionato per me:

     PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(getResources().getColor(R.color.your_color),PorterDuff.Mode.MULTIPLY); imgView.getDrawable().setColorFilter(porterDuffColorFilter); imgView.setBackgroundColor(Color.TRANSPARENT) 

    Breve esempio per modificare il colore disegnabile secondo il field isWorking .

    La mia forma xml:

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@android:color/holo_blue_bright" /> <corners android:radius="30dp" /> <size android:height="15dp" android:width="15dp" /> </shape> 

    Il mio metodo per cambiare:

     private Drawable getColoredDrawable(int drawableResId, boolean isworking) { Drawable d = getResources().getDrawable(R.drawable.shape); ColorFilter filter = new LightingColorFilter( isworking ? Color.GREEN : Color.RED, isworking ? Color.GREEN : Color.RED); d.setColorFilter(filter); return d; } 

    Esempio di utilizzo:

     text1.setCompoundDrawablesWithIntrinsicBounds(getColoredDrawable(R.drawable.shape, isworking()), null, null, null); 

    È molto semplice quando si utilizza una libreria per farlo per te. Prova questo: https://github.com/jrvansuita/IconHandler

    Puoi call come questo:

     Icon.on(holderView).color(R.color.your_color).icon(R.mipmap.your_icon).put(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.