Filtro de color de conjunto de vistas de imagen a degradado
Tengo una imagen blanca que me gustaría colorear con un degradado. En lugar de generar un montón de imágenes de cada color con un gradiente específico, me gustaría hacer esto en el código (no xml).
Para cambiar el color de una imagen,
- ¿Cómo desactivan otros botones cuando presiono el botón?
- Mostrar menú contextual con clic corto no largo
- Android Volley - ¿Cómo animar la carga de imágenes?
- ImageView personalizado con sombra
- Android: ¿Funcionamiento de matriz en ImageView, animado?
imageView.setColorFilter(Color.GREEN);
Y esto funciona bien. Pero, ¿cómo puedo aplicar un color gradiente en lugar de un color sólido? LinearGradient
no ayuda, porque setColorFilter no se puede aplicar a los objetos Shader
.
EDIT : Esta es la imagen que tengo:
Esto es lo que quiero:
Y esto es lo que estoy recibiendo:
- ViewPager onClickListener hace referencia a la vista errónea en android
- Cómo cargar una imagen de dataurl en android imageview?
- Android - Guardar imagenVer en archivo con resolución completa de imagen
- EditText afterTextChanged no funciona
- Cómo evitar el método onClick en la parte transparente de un ImageView cargado de PNG
- Androide multitouch imagen zoom?
- ¿Cómo obtengo diferentes posiciones de clic en un solo ImageView
- PDFRenderer zoom y voltea
Tienes que obtener Bitmap
de tu ImageView
y redibujar el mismo Bitmap
con Shader
public void clickButton(View v){ Bitmap myBitmap = ((BitmapDrawable)myImageView.getDrawable()).getBitmap(); Bitmap newBitmap = addGradient(myBitmap); myImageView.setImageDrawable(new BitmapDrawable(getResources(), newBitmap)); } public Bitmap addGradient(Bitmap originalBitmap) { int width = originalBitmap.getWidth(); int height = originalBitmap.getHeight(); Bitmap updatedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(updatedBitmap); canvas.drawBitmap(originalBitmap, 0, 0, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, 0, 0, height, 0xFFF0D252, 0xFFF07305, Shader.TileMode.CLAMP); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawRect(0, 0, width, height, paint); return updatedBitmap; }
UPDATE 3 He cambiado: colores de degradado, LinearGradient anchura = 0 y PorterDuffXfermode. Aquí una buena imagen para entender PorterDuffXfermode:
Usted podría utilizar un selector
Main_header.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/. android" android:layout_width="fill_parent" android:layout_height="50dip" android:orientation="horizontal" android:background="@drawable/main_header_selector"> </LinearLayout>
Main_header_selector.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/. android"> <item> <shape> <gradient android:angle="90" android:startColor="#FFFF0000" android:endColor="#FF00FF00" android:type="linear" /> </shape> </item> </selector>
El mismo fondo se puede aplicar a un ImageView.
Para definir y utilizar dinámicamente el selector, consulte este enlace: Definición dinámica y uso de selectores
Cree un archivo XML y colóquelo en la carpeta dibujable.
Gradient.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#CCb1e7fa" android:centerColor="#B3ffffff" android:endColor="#CCb1e7fa" android:angle="180" /> <corners android:radius="5dp" /> </shape>
A continuación, agregue esto como fondo a su vista de imagen
<ImageView android:id="@+id/umageview1" android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/gradient" android:layout_centerHorizontal="true" />
- Cómo Incrementar Automáticamente versionCode al exportar aplicaciones de Android en Eclipse?
- Cómo aceptar automáticamente solicitudes de conexión Wi-Fi directamente en Android