着色 ImageView 在 Android 5.0 上不起作用.想法怎么使它再次工作?

本教程将介绍着色 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 上不起作用.想法怎么使它再次工作?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。

0
没有账号?注册  忘记密码?