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

时间:2014-11-27 16:14:43

标签: android imageview android-imageview android-5.0-lollipop

在我构建的应用程序中,我注意到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的设备没有影响。任何想法如何解决它?这是操作系统中的错误,还是应该以不同的方式开始对图像进行着色?

3 个答案:

答案 0 :(得分:8)

根据@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的默认颜色,可能还有其他内容),但如果你有这个想法,你可以适应你的用例。

答案 1 :(得分:2)

像这样使用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"
    />

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

答案 2 :(得分:0)

此代码在android棒棒糖中对我有用

ImageViewCompat.setImageTintList(imageView,ColorStateList.valueOf(Color.parseColor(chartTable.getReport().getButtonColor())));