public class

AppCompatImageView

extends ImageView

implements TintableBackgroundView, TintableImageSourceView

 java.lang.Object

↳ImageView

↳androidx.appcompat.widget.AppCompatImageView

Subclasses:

ImageFilterView

Gradle dependencies

compile group: 'androidx.appcompat', name: 'appcompat', version: '1.7.0'

  • groupId: androidx.appcompat
  • artifactId: appcompat
  • version: 1.7.0

Artifact androidx.appcompat:appcompat:1.7.0 it located at Google repository (https://maven.google.com/)

Androidx artifact mapping:

androidx.appcompat:appcompat com.android.support:appcompat-v7

Androidx class mapping:

androidx.appcompat.widget.AppCompatImageView android.support.v7.widget.AppCompatImageView

Overview

A ImageView which supports compatible features on older versions of the platform, including:

  • Allows dynamic tint of its background via the background tint methods in ViewCompat.
  • Allows setting of the background tint using and .
  • Allows dynamic tint of its image via the image tint methods in ImageViewCompat.
  • Allows setting of the image tint using and .

This will automatically be used when you use ImageView in your layouts and the top-level activity / dialog is provided by appcompat. You should only need to manually use this class when writing custom views.

Summary

Constructors
publicAppCompatImageView(Context context)

publicAppCompatImageView(Context context, AttributeSet attrs)

publicAppCompatImageView(Context context, AttributeSet attrs, int defStyleAttr)

Methods
protected voiddrawableStateChanged()

public ColorStateListgetSupportBackgroundTintList()

This should be accessed via ViewCompat

public PorterDuff.ModegetSupportBackgroundTintMode()

This should be accessed via ViewCompat

public ColorStateListgetSupportImageTintList()

This should be accessed via ImageViewCompat.getImageTintList(ImageView)

public PorterDuff.ModegetSupportImageTintMode()

This should be accessed via ImageViewCompat.getImageTintMode(ImageView)

public booleanhasOverlappingRendering()

public voidsetBackgroundDrawable(Drawable background)

public voidsetBackgroundResource(int resId)

public voidsetImageBitmap(Bitmap bm)

public voidsetImageDrawable(Drawable drawable)

public voidsetImageLevel(int level)

public voidsetImageResource(int resId)

Sets a drawable as the content of this ImageView.

public voidsetImageURI(Uri uri)

public voidsetSupportBackgroundTintList(ColorStateList tint)

This should be accessed via ViewCompat

public voidsetSupportBackgroundTintMode(PorterDuff.Mode tintMode)

This should be accessed via ViewCompat

public voidsetSupportImageTintList(ColorStateList tint)

This should be accessed via ImageViewCompat.setImageTintList(ImageView, ColorStateList)

public voidsetSupportImageTintMode(PorterDuff.Mode tintMode)

This should be accessed via ImageViewCompat.setImageTintMode(ImageView, PorterDuff.Mode)

from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructors

public AppCompatImageView(Context context)

public AppCompatImageView(Context context, AttributeSet attrs)

public AppCompatImageView(Context context, AttributeSet attrs, int defStyleAttr)

Methods

public void setImageResource(int resId)

Sets a drawable as the content of this ImageView.

Allows the use of vector drawables when running on older versions of the platform.

Parameters:

resId: the resource identifier of the drawable

See also: {@link androidx.appcompat.R.attr#srcCompat}

public void setImageDrawable(Drawable drawable)

public void setImageBitmap(Bitmap bm)

public void setImageURI(Uri uri)

public void setBackgroundResource(int resId)

public void setBackgroundDrawable(Drawable background)

public void setSupportBackgroundTintList(ColorStateList tint)

This should be accessed via ViewCompat

public ColorStateList getSupportBackgroundTintList()

This should be accessed via ViewCompat

public void setSupportBackgroundTintMode(PorterDuff.Mode tintMode)

This should be accessed via ViewCompat

public PorterDuff.Mode getSupportBackgroundTintMode()

This should be accessed via ViewCompat

public void setSupportImageTintList(ColorStateList tint)

This should be accessed via ImageViewCompat.setImageTintList(ImageView, ColorStateList)

public ColorStateList getSupportImageTintList()

This should be accessed via ImageViewCompat.getImageTintList(ImageView)

public void setSupportImageTintMode(PorterDuff.Mode tintMode)

This should be accessed via ImageViewCompat.setImageTintMode(ImageView, PorterDuff.Mode)

public PorterDuff.Mode getSupportImageTintMode()

This should be accessed via ImageViewCompat.getImageTintMode(ImageView)

protected void drawableStateChanged()

public boolean hasOverlappingRendering()

public void setImageLevel(int level)

Source

/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.appcompat.widget;

import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;

import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.widget.ImageView;

import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.core.view.TintableBackgroundView;
import androidx.core.widget.ImageViewCompat;
import androidx.core.widget.TintableImageSourceView;
import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;

/**
 * A {@link ImageView} which supports compatible features on older versions of the platform,
 * including:
 * <ul>
 *     <li>Allows dynamic tint of its background via the background tint methods in
 *     {@link androidx.core.view.ViewCompat}.</li>
 *     <li>Allows setting of the background tint using
 *     {@link androidx.appcompat.R.attr#backgroundTint} and
 *     {@link androidx.appcompat.R.attr#backgroundTintMode}.</li>
 *     <li>Allows dynamic tint of its image via the image tint methods in
 *     {@link ImageViewCompat}.</li>
 *     <li>Allows setting of the image tint using {@link androidx.appcompat.R.attr#tint} and
 *     {@link androidx.appcompat.R.attr#tintMode}.</li>
 * </ul>
 *
 * <p>This will automatically be used when you use {@link ImageView} in your layouts
 * and the top-level activity / dialog is provided by
 * <a href="{@docRoot}topic/libraries/support-library/packages.html#v7-appcompat">appcompat</a>.
 * You should only need to manually use this class when writing custom views.</p>
 */
@AppCompatShadowedAttributes
public class AppCompatImageView extends ImageView implements TintableBackgroundView,
        TintableImageSourceView {

    private final AppCompatBackgroundHelper mBackgroundTintHelper;
    private final AppCompatImageHelper mImageHelper;

    private boolean mHasLevel = false;

    public AppCompatImageView(@NonNull Context context) {
        this(context, null);
    }

    public AppCompatImageView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public AppCompatImageView(
            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(TintContextWrapper.wrap(context), attrs, defStyleAttr);

        ThemeUtils.checkAppCompatTheme(this, getContext());

        mBackgroundTintHelper = new AppCompatBackgroundHelper(this);
        mBackgroundTintHelper.loadFromAttributes(attrs, defStyleAttr);

        mImageHelper = new AppCompatImageHelper(this);
        mImageHelper.loadFromAttributes(attrs, defStyleAttr);
    }

    /**
     * Sets a drawable as the content of this ImageView.
     *
     * <p>Allows the use of vector drawables when running on older versions of the platform.</p>
     *
     * @param resId the resource identifier of the drawable
     * @see ImageView#setImageResource(int)
     * {@link androidx.appcompat.R.attr#srcCompat}
     */
    @Override
    public void setImageResource(@DrawableRes int resId) {
        if (mImageHelper != null) {
            // Intercept this call and instead retrieve the Drawable via the image helper
            mImageHelper.setImageResource(resId);
        }
    }

    @Override
    public void setImageDrawable(@Nullable Drawable drawable) {
        if (mImageHelper != null && drawable != null && !mHasLevel) {
            // If there is no level set already then obtain the level from the drawable
            mImageHelper.obtainLevelFromDrawable(drawable);
        }
        super.setImageDrawable(drawable);
        if (mImageHelper != null) {
            mImageHelper.applySupportImageTint();
            if (!mHasLevel) {
                // Apply the level from drawable
                mImageHelper.applyImageLevel();
            }
        }
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        if (mImageHelper != null) {
            mImageHelper.applySupportImageTint();
        }
    }

    @Override
    public void setImageURI(@Nullable Uri uri) {
        super.setImageURI(uri);
        if (mImageHelper != null) {
            mImageHelper.applySupportImageTint();
        }
    }

    @Override
    public void setBackgroundResource(@DrawableRes int resId) {
        super.setBackgroundResource(resId);
        if (mBackgroundTintHelper != null) {
            mBackgroundTintHelper.onSetBackgroundResource(resId);
        }
    }

    @Override
    public void setBackgroundDrawable(@Nullable Drawable background) {
        super.setBackgroundDrawable(background);
        if (mBackgroundTintHelper != null) {
            mBackgroundTintHelper.onSetBackgroundDrawable(background);
        }
    }

    /**
     * This should be accessed via
     * {@link androidx.core.view.ViewCompat#setBackgroundTintList(android.view.View, ColorStateList)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    public void setSupportBackgroundTintList(@Nullable ColorStateList tint) {
        if (mBackgroundTintHelper != null) {
            mBackgroundTintHelper.setSupportBackgroundTintList(tint);
        }
    }

    /**
     * This should be accessed via
     * {@link androidx.core.view.ViewCompat#getBackgroundTintList(android.view.View)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    @Nullable
    public ColorStateList getSupportBackgroundTintList() {
        return mBackgroundTintHelper != null
                ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
    }

    /**
     * This should be accessed via
     * {@link androidx.core.view.ViewCompat#setBackgroundTintMode(android.view.View, PorterDuff.Mode)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
        if (mBackgroundTintHelper != null) {
            mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
        }
    }

    /**
     * This should be accessed via
     * {@link androidx.core.view.ViewCompat#getBackgroundTintMode(android.view.View)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    @Nullable
    public PorterDuff.Mode getSupportBackgroundTintMode() {
        return mBackgroundTintHelper != null
                ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
    }

    /**
     * This should be accessed via
     * {@link androidx.core.widget.ImageViewCompat#setImageTintList(ImageView, ColorStateList)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    public void setSupportImageTintList(@Nullable ColorStateList tint) {
        if (mImageHelper != null) {
            mImageHelper.setSupportImageTintList(tint);
        }
    }

    /**
     * This should be accessed via
     * {@link androidx.core.widget.ImageViewCompat#getImageTintList(ImageView)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    @Nullable
    public ColorStateList getSupportImageTintList() {
        return mImageHelper != null
                ? mImageHelper.getSupportImageTintList() : null;
    }

    /**
     * This should be accessed via
     * {@link androidx.core.widget.ImageViewCompat#setImageTintMode(ImageView, PorterDuff.Mode)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    public void setSupportImageTintMode(@Nullable PorterDuff.Mode tintMode) {
        if (mImageHelper != null) {
            mImageHelper.setSupportImageTintMode(tintMode);
        }
    }

    /**
     * This should be accessed via
     * {@link androidx.core.widget.ImageViewCompat#getImageTintMode(ImageView)}
     *
     */
    @RestrictTo(LIBRARY_GROUP_PREFIX)
    @Override
    @Nullable
    public PorterDuff.Mode getSupportImageTintMode() {
        return mImageHelper != null
                ? mImageHelper.getSupportImageTintMode() : null;
    }

    @Override
    protected void drawableStateChanged() {
        super.drawableStateChanged();
        if (mBackgroundTintHelper != null) {
            mBackgroundTintHelper.applySupportBackgroundTint();
        }
        if (mImageHelper != null) {
            mImageHelper.applySupportImageTint();
        }
    }

    @Override
    public boolean hasOverlappingRendering() {
        return mImageHelper.hasOverlappingRendering() && super.hasOverlappingRendering();
    }

    @Override
    public void setImageLevel(int level) {
        super.setImageLevel(level);
        mHasLevel = true;
    }
}