7

Trong một ứng dụng tôi đã xây dựng, tôi nhận thấy rằng ImageViews không được tô màu trên các thiết bị chạy Android Lollipop mới. Đây là mã được sử dụng để làm việc một cách chính xác trên các phiên bản cũ của hệ điều hành:Tinting ImageView không hoạt động trên Android 5.0. Ý tưởng làm thế nào để làm cho nó hoạt động trở lại?

<ImageView 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_gravity="bottom|right" 
      android:contentDescription="@string/descr_background_image" 
      android:src="@drawable/circle_shape_white_color" 
      android:tint="@color/intent_circle_green_grey" /> 

và đây là drawable được nạp trong ImageView:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 
    <gradient android:startColor="@color/white" android:endColor="@color/white" 
     android:angle="270"/> 
</shape> 

Một lần nữa, điều này đang làm việc một cách chính xác trên các thiết bị chạy Jellybean/Kitkat, nhưng tông màu không ảnh hưởng đến các thiết bị chạy Lollipop. làm thế nào để khắc phục các ý tưởng đó? Nó có phải là một lỗi trong hệ điều hành, hay tôi nên bắt đầu pha màu ảnh khác nhau?

+2

Lỗi hệ điều hành đã được khắc phục cho bản phát hành trong tương lai. Thuộc tính tint của ImageView đã được cập nhật để sử dụng Drawable.setTint() thay vì Drawable.setColorFilter(), nhưng GradientDrawable không hỗ trợ setTint(). Không thực sự là một giải pháp tốt cho điều này từ XML, nhưng bạn có thể gọi setColorFilter() từ mã. – alanv

+0

Thật tuyệt vời khi biết rằng bạn đã quan tâm đến nó! Cảm ơn câu trả lời :) –

Trả lời

8

Theo nhận xét @alanv, ở đây hãy sửa lỗi hacky này. Ý tưởng cơ bản là mở rộng và áp dụng ImageViewColorFilter ngay sau khi lạm phát:

public class TintImageView extends ImageView { 

    public TintImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     initView(); 
    } 

    private void initView() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      ColorStateList imageTintList = getImageTintList(); 
      if (imageTintList == null) { 
       return; 
      } 

      setColorFilter(imageTintList.getDefaultColor(), PorterDuff.Mode.SRC_IN); 
     } 
    } 
} 

Như bạn có thể đoán, ví dụ này có phần hạn chế (Drawable bộ sau tint lạm phát sẽ không được cập nhật, chỉ có màu mặc định của ColorStateList được sử dụng, và có thể một cái gì đó khác), nhưng nếu bạn có ý tưởng bạn có thể phù hợp với trường hợp sử dụng của bạn.

1

Sử dụng AppCompatImageView như vậy:

<android.support.v7.widget.AppCompatImageView 
     android:id="@+id/my_appcompat_imageview" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/my_image" 
     android:tint="#636363" 
    /> 

Đảm bảo bạn có mới nhất compile 'com.android.support:appcompat-v7:23.4.0' trong của build.gradle ứng dụng của bạn.

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