本教程将介绍着色 ImageView 在 Android 5.0 上不起作用.想法如何使它再次工作?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
在我构建的一个应用程序中,我注意到 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 中的可绘制对象:
<?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
设置在inflation tint之后不会被更新,只使用ColorStateList
的默认颜色,也许还有什么否则),但如果你有这个想法,你可以把它适应你的用例.
好了关于着色 ImageView 在 Android 5.0 上不起作用.想法怎么使它再次工作?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。