android - online - Imageview establece el filtro de color a degradado
online gradient generator (3)
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"
/>
Tengo una imagen en blanco que me gustaría colorear con un degradado. En lugar de generar un montón de imágenes, cada una coloreada con un degradado específico, me gustaría hacer esto en código (no en xml).
Para cambiar el color de una imagen, uso
imageView.setColorFilter(Color.GREEN);
Y esto funciona bien. Pero, ¿cómo puedo aplicar un color degradado en lugar de un color sólido? LinearGradient
no ayuda, porque setColorFilter no se puede aplicar a objetos Shader
.
EDITAR : Esta es la imagen que tengo:
Esto es lo que quiero:
Y esto es lo que estoy recibiendo:
Podrías usar 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 el selector dinámicamente, consulte este enlace: Definición dinámica y uso de selectores
Tienes que obtener el Bitmap
de Bitmap
de tu ImageView
y volver a dibujar 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;
}
ACTUALIZACIÓN 3 Cambié: colores de gradiente, ancho lineal de gradiente = 0 y PorterDuffXfermode. Aquí una buena foto para entender PorterDuffXfermode: