首页 文章

着色ImageView无法在Android 5.0上运行 . 想法如何让它再次运作?

提问于
浏览
8

在我构建的应用程序中,我注意到ImageViews没有在运行新Android Lollipop的设备上着色 . 这是以前在旧版操作系统上正常工作的代码:

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

这是在ImageView中加载的drawable:

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

再次,这在运行JellyBean / Kitkat的设备上正常工作,但色调对运行Lollipop的设备没有影响 . 任何想法如何解决它?这是操作系统中的错误,还是应该以不同的方式开始对图像进行着色?

2 回答

  • 8

    像这样使用 AppCompatImageView

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

    确保你的应用程序的 build.gradle 中有最新的 compile 'com.android.support:appcompat-v7:23.4.0' .

  • 2

    根据@alanv评论,这里有针对这个bug的hacky修复 . 通胀的基本思路是扩展 ImageView 并立即申请 ColorFilter

    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);
            }
        }
    }
    

    正如你可能猜到的那样,这个例子有些限制( Drawable 设置后,通胀色调不会更新,只使用 ColorStateList 的默认颜色,也许还有别的东西),但是如果你有了这个想法,你可以适应你的使用 - 案件 .

相关问题