2011-11-19 18 views
18

Tôi muốn thêm một ColorFilter vào ImageView.tôi muốn thêm bộ lọc màu vào hình ảnh thu nhỏ

Hiện nay tôi đang sử dụng:

ImageView iv = (ImageView)findViewById(resIdOfImageToFilter); 
iv.setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP); 

Tôi đã kiểm tra Nhiều chế độ trong PotterDuff như SRC_IN, SRC vv, nhưng tôi không nhận được bất kỳ sự khác biệt trong bất kỳ chế độ ... Tất cả chế độ biến toàn bộ ImageView bằng màu đỏ hoàn hảo.

tôi cần để pha trộn màu RED trong hình ảnh hiện có để hình ảnh đó sẽ xem xét với một ánh đỏ ....

+2

oops ... đúng cách cần làm là PorterDuff.Mode.Lighten ... –

+0

Đó là vì không có kênh alpha (tức là minh bạch) trong hình ảnh của bạn.Thông thường 'setColorFilter()' được sử dụng để tô màu các biểu tượng, và trên thực tế, hành vi mặc định là tô màu tất cả hình ảnh chỉ giữ lại kênh alpha. Thay vào đó, 'PorterDuff.Mode.LIGHTEN' giữ độ sáng, vì vậy các phần màu của hình ảnh của bạn chuyển sang màu đỏ và các phần màu trắng sẽ bị bỏ lại. –

Trả lời

25

Cách thực hiện đúng là sử dụng PorterDuff.Mode.LIGHTEN.

Vì vậy, các mã được cập nhật sẽ như thế nào:

ImageView iv = (ImageView)findViewById(resIdOfImageToFilter); 
iv.setColorFilter(Color.RED, PorterDuff.Mode.LIGHTEN); 
+1

Đó là vì không có kênh alpha (tức là minh bạch) trong hình ảnh của bạn. Thông thường 'setColorFilter()' được sử dụng để tô màu các biểu tượng, và trên thực tế, hành vi mặc định là tô màu tất cả hình ảnh chỉ giữ lại kênh alpha. Thay vào đó, 'PorterDuff.Mode.LIGHTEN' giữ độ sáng, vì vậy các phần màu của hình ảnh của bạn chuyển sang màu đỏ và các phần màu trắng sẽ bị bỏ lại. –

6

này đã làm việc cho tôi:

trong res/colors.xml:

<color name="highlight_color_filter">#A5FF0000</color> 

trong hoạt động của bạn khởi tạo bộ lọc và nổi bật sơn:

int highlightColor = context.getResources().getColor(R.color.highlight_color_filter); 
PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(highlightColor, PorterDuff.Mode.SRC_ATOP); 

Paint redHighLight = new Paint(); 
redHighLight.setColorFilter(targetHitFilter); 
redHighLight.setAlpha(190); 

sau đó ap ply các bộ lọc cho ImageView:

ImageView iv=(ImageView)findViewById(ResIdOfImageToFilter); 
iv.setColorFilter(redHighLight); 

nếu điều đó không làm việc cố gắng áp dụng cho đối tượng vẽ ImageView:

iv.getDrawable().setColorFilter(redHighLight); 

hy vọng rằng sẽ giúp.

+0

Không phải là một ý nghĩa hay bất cứ điều gì, nhưng đây là một câu trả lời tốt hơn: http://stackoverflow.com/questions/10114420/applying-colorfilter-to-imageview-with-shapeddrawable – pgsandstrom

+10

Điều này sẽ không biên dịch. redHighLight là một Paint không phải là ColorFilter. –

2

giải pháp khác, bạn có thể đã giữ PorterDuff.Mode.SRC_ATOP chế độ và sử dụng alpha khác để có màu trong suốt.

tôi sử dụng 155 là giá trị Alpha:

final int semiTransparentGrey = Color.argb(155, 185, 185, 185); 
    drawable.setColorFilter(semiTransparentGrey, PorterDuff.Mode.SRC_ATOP); 
+0

làm cách nào để bạn đặt 155 aplha? – behelit

+0

Bạn có thể đặt trực tiếp alpha, đặt giá trị argb đầu tiên để xác định màu bên trong tài nguyên color.xml ví dụ hoặc trong mã. Ví dụ: int FILTERED_GREY = Color.argb (155, 185, 185, 185); –

+0

Đây là câu trả lời đúng! – GensaGames

5

Bạn có thể sử dụng android: tint (link) trong bạn xml file. Ví dụ:

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/your_drawable" 
    android:tint="@color/your_color" /> 
+1

Nên là câu trả lời hàng đầu. Nơi your_color là một cái gì đó như thế này; '' ' # 55000000' '' –

0

Trong file xml của bạn, bạn có thể sử dụng màu Ví dụ

 <ImageView 
      android:id="@+id/scrachImage_1" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:tint="@color/colorAccent" 
      android:src="@drawable/eagle" /> 

Nếu bạn muốn lập trình thêm bộ lọc màu sau đó sử dụng

scratchImage_2.setColorFilter(Color.BLACK); 

Bạn cũng có thể loại bỏ bộ lọc màu này sử dụng mã này:

scratchImage_2.setColorFilter(null);