在我构建的应用程序中,我注意到
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的设备没有影响.任何想法如何解决它?这是操作系统中的错误,还是应该以不同的方式开始对图像进行着色?
解决方法
根据@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的默认颜色,也许还有别的东西),但如果你有了这个想法,你可以根据自己的需要使用它 – 案件.