API <21 için çekilebilir renklendirme


84

API <21 için çekilebilir renklendirme çalışması yapmak mümkün mü?

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

Gayet iyi çalışıyor, ancak yalnızca API21'e sahip cihazlar için. Daha düşük api cihazları veya AppCompat desteği için herhangi bir geçici çözüm var mı? Hiçbir şey bulamıyorum.

Yanıtlar:


106

Şöyle kullanın 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-v7Uygulamanızda en son sürümlere sahip olduğunuzdan emin olun build.gradle.

Örnek: compile 'com.android.support:appcompat-v7:25.0.0'uygulamanızın build.gradle.


66
Gönderen AppCompatImageViewdocs: 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/... Yani normal kullanılarak ImageViewdüzeninde sadece para cezası çalışmalıdır.
Nimrod Dayan

1
@NimrodDayan'ın yukarıda bahsettiği gibi, bu gerekli olmamalı. Android: tint'in Samsung A5 ve Moto G'de çalışmadığı raporlarını alıyorum, ancak (appcompat-v7: 23.4.0 kullanarak), bu nedenle ImageView'ların bazı cihazlarda düzgün şekilde değiştirilmemesi olası.
Stephen Kidson

@StephenKidson, appcompat'ın aynı sürümünü kullanıyorum ve aynı zamanda bilinmeyen bir marka cihazda aynı soruna rastladım. Bunu çözmeyi başardınız mı? Acaba bununla ilgili rapor edilmiş bir hata var mı ...
Nimrod Dayan

4
Bu, appcompat-v7: 25.1.0 kullanan emülatör Android 4.0 üzerinde çalışmadı.
Peterdk

4
AppCompatImageView bir Widget içinde kullanılamaz. ImageView üzerinde setColorFilter kullanın.
Massimo

46

Bunu kaynak kodunu kullanarak başarabilirsiniz. Daha önce renklendirme özelliği tarafından desteklenmiyordu DrawableCompat. 22.1 numaralı destek kitaplığından başlayarak bunu yapabilirsiniz, ancak bunu şu şekilde yapmanız gerekir:

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

18
21'den az API'de renklendirmeyi desteklemeniz gerekiyorsa, muhtemelen ContextCompat.getColor()bunun yerine kullanmak istersiniz getResources().getColor().
Sevastyan Savanyuk

22

Drawable'ınızı görüntülemek için bir ImageView kullanamaz mısınız? android:tinteski API seviyelerinde iyi çalışır.

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

2
ImageView - içindeki simgeyi görüntülemek için kullanıyorum. Bu simgeler, gezinme çekmecemdeki öğelerin parçasıdır. Gezinme çekmecesinde seçilen öğenin farklı rengi var, bu nedenle her bir simgeyi renkli ve ayrıca her simge için seçici oluşturdum. Ve simgem için bu seçiciyi kullanıyorum. Seçici:<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>
MaTo

@Orochi Doğrudan Google'ın bloglarından geldiği için cevabıma bir göz atın. Esas olarak yalnızca Android 5.0+ üzerinde çalışır, ancak Android 5.0 öncesi çalıştıran cihazlar için bazı widget'larda da çalışabilir.
Jared Burrows

@Orochi Aynı efekti "taklit etmek" için özel görünümler oluşturmanız gerekecek.
Jared Burrows

1
İv.setColorFilter (yourColor, Mode.Multiply) ile bir resim görünümü kullanabilir, simgeyi olabildiğince beyaz yapabilir ve istediğiniz rengi yapabilirsiniz;
Android.graphics.PorterDuff.Mode'u

3
Burada da aynı problem. Maalesef seçici ile renk tonu api <21 ile çalışmıyor
Luccas

17

Burada daha önce benzer bir soru sorulmuştu: https://stackoverflow.com/a/26533340/950427

Android Çizilebilir Renklendirme, yalnızca Android 5.0+ (API 21+) sürümlerinde desteklenir. (" At the moment this is limited to coloring the action bar and some widgets." Diyor ).

Temalar

...

Bu öznitelikleri ayarladığınızda, AppCompat değerlerini API 21+ üzerindeki çerçeve özniteliklerine otomatik olarak yayar. Bu, durum çubuğunu ve Genel Bakış (Son Aramalar) görev girişini otomatik olarak renklendirir.

Eski platformlarda, AppCompat mümkün olduğunda renk temasını taklit eder. Şu anda bu işlem çubuğunu ve bazı widget'ları renklendirmekle sınırlıdır.

Ve

Widget renklendirme

Android 5.0 yüklü cihazlarda çalışırken, tüm widget'lar az önce bahsettiğimiz renk teması özellikleri kullanılarak renklendirilir. Lollipop'ta buna izin veren iki ana özellik vardır: çekilebilir renklendirme ve çekilebilir öğelerdeki tema niteliklerine (? Attr / foo biçiminde) referans verme.

AppCompat, bir UI widget alt kümesi için önceki Android sürümlerinde benzer davranış sağlar:

AppCompat'ın araç çubuğu tarafından sağlanan her şey (eylem modları, vb.) EditText Spinner CheckBox RadioButton Switch (yeni android.support.v7.widget.SwitchCompat'ı kullanın) CheckedTextView Bu işleri yapmak için özel bir şey yapmanıza gerek yok, sadece şu kontrolleri kullanın Düzenleriniz her zamanki gibi ve AppCompat gerisini halledecektir (bazı uyarılarla; aşağıdaki SSS bölümüne bakın).

Kaynaklar:

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

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


Bu neden reddedildi? Bu resmi belgelerden.
Jared Burrows

Cevap güncel değil. ImageViewAyrıca android:tint@ Jonik'in cevabında olduğu gibi artık AppCompat aracılığıyla da destekleniyor .
Vicky Chijwani

@VickyChijwani Bir düzenleme gönderin. Ve AppCompatImageViewdeğil mi demek istiyorsun ImageView?
Jared Burrows

13

Artık AppCompatImageView, AppCompatButton, daha düşük API'li cihazlarda renk tonunu desteklemek için ImageView, Button'ın yerini alacak. Daha fazla ayrıntı için bağlantıyı kontrol edin AppCompatImageView , AppCompatButton


6

Resimleri renklendirmek için kullanabilirsiniz imageView.setColorFilter(int color). Bu, API 8'den çalışıyor ve siyah resmimi istediğim renge renklendirmek için çalıştı. Bu yerini alabilir setImageTintList()ancak sadece kullanmak android:tintda işe yaramalıdır.


6

Bu NameSpace
xmlns: app = "http://schemas.android.com/apk/res-auto" adresini kullanın

ve sonra her android: tint'i app: tint ile değiştirebilirsiniz. Bu benim için sorunu çözdü.


4

Biraz geciktim ama işte nasıl yapılacağı.

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

Bu, istediğiniz gibi yapacak ve destek kitaplığının tüm Android sürümlerinde çalışmalıdır:

@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

Yeni çekilebilir (tin1, tint2 ..) oluşturmak isteyen varsa bunu deneyin

<?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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.