api <21の描画可能な色合い


84

api <21でドローアブルティントを機能させることは可能ですか?

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary" />

正常に動作しますが、API21を備えたデバイスでのみ機能します。より低いAPIデバイスまたはAppCompatサポートの回避策はありますか?何も見つかりません。

回答:


106

その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"
    />

appcompat-v7アプリの最新のものがあることを確認してくださいbuild.gradle

例:compile 'com.android.support:appcompat-v7:25.0.0'アプリのbuild.gradle


66
AppCompatImageViewドキュメントから:This will automatically be used when you use ImageView in your layouts. You should only need to manually use this class when writing custom views. developer.android.com/reference/android/support/v7/widget/…したがって、ImageViewレイアウトで法線を使用すると問題なく動作するはずです。
Nimrod Dayan 2016

1
上記の@NimrodDayanのように、これは必要ないはずです。ただし、Android:tintがSamsungA5とMotoGで機能しないという報告があります(appcompat-v7:23.4.0を使用)。そのため、一部のデバイスでImageViewが正しく置き換えられていない可能性があります。
スティーブンキッドソン2016

@StephenKidson、私は同じバージョンのappcompatを使用していて、未知のブランドのデバイスでも同じ問題にぶつかりました。これをなんとか解決できましたか?...これについて報告バグがあるかどうだろうか
ニムロッドダヤン

4
これは、appcompat-v7:25.1.0を使用するエミュレーターAndroid4.0では機能しませんでした。
Peterdk 2017年

4
AppCompatImageViewはウィジェット内では使用できません。ImageViewでsetColorFilterを使用します。
マッシモ

46

あなたはソースコードを使用してそれを達成することができます。以前は、色付けはによってサポートされていませんでしたDrawableCompat。サポートライブラリ22.1からそれを行うことができますが、次のようにする必要があります。

Drawable normalDrawable = getResources().getDrawable(R.drawable.drawable_to_tint);
Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
DrawableCompat.setTint(wrapDrawable, getResources().getColor(R.color.colorPrimaryLight));

18
21未満のAPIでの色付けをサポートする必要がある場合は、のContextCompat.getColor()代わりに使用することをお勧めしますgetResources().getColor()
Sevastyan Savanyuk 2017

22

単にImageViewを使用してDrawableを表示することはできませんか?android:tint古いAPIレベルで正常に動作します。

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary"
    />

2
ImageViewを使用しています-アイコンを表示します。これらのアイコンは、ナビゲーションドロワーの要素の一部です。また、ナビゲーションドロワーで選択したアイテムの色が異なるため、色付きの各アイコンと、各アイコンのセレクターを作成しました。そして、私はアイコンにそのセレクターを使用しています。セレクター:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@drawable/ic_home_tinted" /> <item android:drawable="@drawable/ic_home" /> </selector>
MaTTo 2015年

@Orochiグーグルのブログから直接来ている私の答えを見てください。これは主にAndroid5.0以降でのみ機能しますが、Android5.0より前のデバイスの一部のウィジェットでも機能する場合があります。
Jared Burrows 2015年

@Orochi同じ効果を「エミュレート」するには、カスタムビューを作成する必要があります。
Jared Burrows 2015年

1
iv.setColorFilter(yourColor、Mode.Multiply);を使用して、画像ビューを使用し、アイコンをできるだけ白にし、任意の色にすることができます。android.graphics.PorterDuff.Mode
jb15613 2015年

3
ここでも同じ問題があります。悲しいことに、セレクターの色合いはapi <21では機能しません
Luccas 2016年

17

同様の質問がここで以前に尋ねられました:https//stackoverflow.com/a/26533340/950427

Android Drawable Tintingは、Android 5.0以降(API 21以降)でのみサポートされています。(「At the moment this is limited to coloring the action bar and some widgets.」と表示されます)。

テーマ

..。

これらの属性を設定すると、AppCompatはそれらの値をAPI21以降のフレームワーク属性に自動的に伝播します。これにより、ステータスバーと概要(最近)タスクエントリに自動的に色が付けられます。

古いプラットフォームでは、AppCompatは可能な場合はカラーテーマをエミュレートします。現時点では、これはアクションバーと一部のウィジェットの色付けに限定されています。

そして

ウィジェットの色合い

Android 5.0を搭載したデバイスで実行している場合、すべてのウィジェットは、先ほど説明したカラーテーマ属性を使用して色付けされます。Lollipopでこれを可能にする2つの主な機能があります。描画可能な色付けと、描画可能なテーマ属性(?attr / fooの形式)の参照です。

AppCompatは、UIウィジェットのサブセットに対して以前のバージョンのAndroidで同様の動作を提供します。

AppCompatのツールバーによって提供されるすべて(アクションモードなど)EditText Spinner CheckBox RadioButton Switch(新しいandroid.support.v7.widget.SwitchCompatを使用)CheckedTextViewこれらを機能させるために特別なことをする必要はなく、次のコントロールを使用するだけです。レイアウトは通常どおりで、AppCompatが残りを実行します(いくつかの注意点があります。以下のFAQを参照してください)。

出典:

http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

https://chris.banes.me/2014/10/17/appcompat-v21/


なぜこれが反対票を投じられたのですか?これは公式ドキュメントからのものです。
Jared Burrows 2015

答えは時代遅れです。@Jonikの回答のように、AppCompat経由でImageViewもサポートするandroid:tintようになりました。
Vicky Chijwani 2016年

@VickyChijwani編集を送信します。そして、あなたは意味しますAppCompatImageView、ではありませんImageView
Jared Burrows 2016年


6

画像の色付けには、を使用できますimageView.setColorFilter(int color)。これはAPI8から機能し、黒の画像を希望の色に着色するために機能しました。これは置き換えることsetImageTintList()ができますが、使用android:tintするだけでも機能するはずです。


4

このNameSpacexmlns
:app = "http://schemas.android.com/apk/res-auto"を使用してください

そして、すべてのandroid:tintをapp:tintに置き換えることができます。これで問題が解決します。


4

少し遅れましたが、その方法は次のとおりです。

val textInput = EditText(context)

val drawable = ContextCompat.getDrawable(context, R.drawable.your_drawable)
drawable?.let {
    myDrawable -> DrawableCompat.setTint(myDrawable, ContextCompat.getColor(context, R.color.your_color))
    textInput.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, myDrawable, null)
}

1

これは必要に応じて機能し、サポートライブラリのすべてのAndroidバージョンで機能するはずです。

@JvmStatic
fun getTintedDrawable(inputDrawable: Drawable, @ColorInt color: Int): Drawable {
    val wrapDrawable = DrawableCompat.wrap(inputDrawable.mutate())
    DrawableCompat.setTint(wrapDrawable, color)
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN)
    return wrapDrawable
}

1

誰かが新しいドローアブル(tin1、tint2 ..)を作成したい場合は、これを試してください

<?xml version="1.0" encoding="utf-8"?>
<bitmap
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/your_image"
  android:tint="@color/tint_color">
   </bitmap>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.