2013-03-28 40 views
6

Trong một ứng dụng tôi đang phát triển, tôi đang cố tạo một ImageButton là một bản sao của ImageButton được chọn, nhưng hình ảnh được tô màu theo một cách khác, giả sử màu đỏ.Tạm thời thay đổi màu có thể vẽ

Nếu tôi sử dụng PowerDuff.Mode.MULTIPLY:

clonebutton.getDrawable().setColorFilter(0xFFFF0000,Mode.MULTIPLY); 

Sau đó, ngay cả những gốc ImageButton thay đổi màu sắc của nó thành màu đỏ kể từ khi họ chia sẻ cùng drawable. Có cách nào để áp dụng bộ lọc chỉ trên clonebutton mà không sử dụng hai khác nhau drawables? Ví dụ là nó có thể trong một số cách để đặt một lớp colorize trên đầu trang của clonebutton mà không cần chỉnh sửa drawable?

Cập nhật tôi đặt drawable như có thể thay đổi:

Drawable d = swipebutton.getDrawable(); 
d.mutate(); 
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 
swipebutton.setImageDrawable(d); 

Điều này ngăn cản clonebutton của tôi để chia sẻ trạng thái của drawable của nó để views khác.

Trả lời

13
Drawable buttonBackground = clonebutton.getDrawable(); 
buttonBackground = buttonBackground.mutate(); 
buttonBackground.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 

Hãy drawable có thể thay đổi này. Không thể đảo ngược thao tác này. A có thể rút được có thể thay đổi được đảm bảo không chia sẻ trạng thái của nó với bất kỳ số khác drawable. Điều này đặc biệt hữu ích khi bạn cần sửa đổi các thuộc tính các đối tượng được tải từ tài nguyên. Theo mặc định, tất cả các trường hợp drawable trường hợp được tải từ cùng một tài nguyên chia sẻ một trạng thái chung; nếu bạn sửa đổi trạng thái của một phiên bản, tất cả các phiên bản khác sẽ nhận được sửa đổi tương tự. Gọi phương thức này trên một Drawable có thể thay đổi sẽ không có hiệu lực.

+0

này làm việc hoàn hảo! – Vektor88

+0

Câu trả lời đến nhanh đến mức tôi không thể chấp nhận nó vào lúc đó vì danh tiếng thấp của tôi, nhưng điều này chắc chắn hoạt động! – Vektor88

+0

:) ........ không phải lo lắng – Triode

0
Drawable d=clonebutton.getDrawable() 
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 
clonebutton.setDrawable(d); 

thử này: hoặc đưa vào mã bên dưới theo nhu cầu của bạn

switch(v.getId()) 
{ 
case R.id.bt1: 
    Drawable d=b11.getBackground(); 
    d.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 

    b11.setBackgroundDrawable(d); 
    b12.setBackgroundResource(android.R.drawable.btn_default); 
break; 

case R.id.bt2: 
//b2.getBackground().setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 
Drawable dd=b12.getBackground(); 
dd.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 

b12.setBackgroundDrawable(dd); 
b11.setBackgroundResource(android.R.drawable.btn_default); 
break; 
} 

switching color of buttons after onclick

+0

Thao tác này sẽ không hoạt động vì đối tượng có thể vẽ được tham chiếu giống nhau. – Vektor88

+0

bạn đã kiểm tra mã thứ hai như nó đã làm việc cho tôi –

+0

Trong trường hợp của tôi, tôi muốn tô màu nền có thể vẽ và không phải nền. Hai nút chia sẻ cùng một drawable nhưng không cùng nền và điều này giải thích tại sao nó hoạt động, nhưng nó không phải là những gì tôi muốn đạt được – Vektor88

1

Trên Lollipop, bạn không phải thực hiện việc lập trình này, ví dụ: colorfilters, nếu bạn không muốn. Bạn có thể làm điều đó chỉ bằng cách thiết lập một sắc thái trên một xml drawable.

<?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"/> 

Điều này có thể không hoạt động nếu bạn có số lượng màu không được phép nhưng nếu chúng bị giới hạn thì đây thực sự là một lựa chọn tốt. Check out my blog post for more information.

+0

Câu trả lời hay Tôi đã thử điều này nhưng nó không hoạt động vì tôi đã sử dụng '# 000' thay cho' # ff000000'.Đó là attibute được cho phép trong Lollipop cũng không phải là tài liệu. Họ nên thêm cái này. – rekire

Các vấn đề liên quan