2013-09-23 77 views
27

Tôi đang cố gắng triển khai một bộ lọc màu đơn giản trên một lần xem hình ảnh để biến hình ảnh màu đen thành hình ảnh màu trắng. Để đạt được điều đó, tôi làm như sau:setColorFilter không hoạt động

weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 
    weatherImg.setImageResource(R.drawable.b_clouded_rain); 

Tôi cũng đã cố gắng đổi màu trong bộ lọc màu thành đỏ và trắng nhưng tất cả đều không có hiệu lực, tôi đang làm gì sai?

Trả lời

66

Càng nhiều càng tốt Tôi ghét phải trả lời câu hỏi của riêng tôi, tôi thấy vấn đề: tôi nên đã sử dụng:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); 
+7

'PorterDuff.Mode.SRC_ATOP' đó là được sử dụng bởi mặc định, 'weatherImg.setColorFilter (Color.WHITE)' sẽ làm việc quá;) – GuilhE

21

Nó phụ thuộc vào loại lọc bạn muốn áp dụng. Nếu yout muốn áp dụng một màu sắc mới trên một hình ảnh với đèn chiếu lên nó, đó là những gì làm việc cho tôi:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); 

Nếu bạn muốn tìm hiểu thêm về PorterDuff này bộ lọc, tôi tìm thấy một bài viết goog đó giúp tôi hiểu: http://www.ibm.com/developerworks/java/library/j-mer0918/ cung cấp cho nó một đọc :)

14

Có cùng một vấn đề trên Android 6. Giải quyết bằng cách sử dụng ImageView.getDrawable().setColorFilter() thay vì ImageView.setColorFilter().

2

Tôi đã gặp vấn đề với setColorFilter trên Samsung S3 chạy phiên bản 4.3 và cách duy nhất tôi có thể nhận được các bộ lọc để làm việc là bằng cách áp dụng nó trong draw(Canvas canvas) phương pháp:

public class ColouredDrawable extends BitmapDrawable { 

private ColorFilter mColorFilter; 

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) { 
    super(resources, toTransform); 
    float[] matrix = { 
      0, 0, 0, 0, ((toColour & 0xFF0000)/0xFFFF), 
      0, 0, 0, 0, ((toColour & 0xFF00)/0xFF), 
      0, 0, 0, 0, (toColour & 0xFF), 
      0, 0, 0, 1, 0 }; 
    mColorFilter = new ColorMatrixColorFilter(matrix); 
} 

@Override 
public void draw(Canvas canvas) { 
    setColorFilter(mColorFilter); 
    super.draw(canvas); 
} 

đơn giản áp dụng setColorFilter đến didn BitmapDrawable dường như không có hiệu lực.

+0

Cùng một vấn đề trên S4 4.4.4. – Simas

+0

Tương tự ở đây với 2 thiết bị samsung trên 4.3 và 4.4.4! Điều này thật sự tệ! – sud007

+1

Tương tự ở đây trên Android trước Lollipop. NinePatchDrawable cũng bị ảnh hưởng. Tôi đã giải quyết bằng cách ghi đè lớp có thể vẽ và đặt colorFilter thành đối tượng sơn theo phương thức vẽ: @Override vẽ khoảng trống công khai (Canvas canvas) { getPaint(). SetColorFilter (your_colorFilter); super.draw (canvas); } – Venator85

1

Đối với tôi chỉ có giải pháp này làm việc:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 
image.setImageResource(R.drawable.img); 

lọc được áp dụng nếu R.drawable.img là hình ảnh vector, và không có hiệu lực đối với tài nguyên raster

3

Chúng tôi sử dụng mã này

Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource)); 
     drawable.mutate(); 
     DrawableCompat.setTint(drawable, getColor(color)); 
     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 

public static int getColor(int id) { 
     return ContextCompat.getColor(getInstance().context, id); 
    } 

public static Drawable getDrawable(int id) { 
     return ContextCompat.getDrawable(getInstance().context, id); 
    } 
0

Đối với Android 4.3 và 4.4, setColorFilter không hoạt động. Sử dụng DrawableCompat để thay thế.

val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
      context, 
      R.drawable.b_clouded_rain)); 
    DrawableCompat.setTint(drawable, foregroundColor); 
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN) 
      .setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY); 

    weatherImg.setImageResource(R.drawable.b_clouded_rain);