Pha màu có thể vẽ cho api <21


84

Có thể làm cho công việc pha màu vẽ được cho api <21 không?

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

Hoạt động tốt nhưng chỉ dành cho các thiết bị có API21. Bất kỳ giải pháp nào cho các thiết bị api thấp hơn hoặc hỗ trợ AppCompat? Không tìm thấy gì cả.

Câu trả lời:


106

Sử dụng AppCompatImageViewnhư vậy:

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

Đảm bảo rằng bạn có thông tin mới nhất appcompat-v7trong ứng dụng của mình build.gradle.

Ví dụ: compile 'com.android.support:appcompat-v7:25.0.0'trong ứng dụng của bạn build.gradle.


66
Từ 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/… Vì vậy, sử dụng bình thường ImageViewtrong bố cục sẽ hoạt động tốt.
Nimrod Dayan

1
Như @NimrodDayan đã đề cập ở trên, điều này không cần thiết. Tuy nhiên, tôi nhận được báo cáo về việc android: tint không hoạt động trên Samsung A5 và Moto G (sử dụng appcompat-v7: 23.4.0), vì vậy có thể ImageViews không được thay thế đúng cách trên một số thiết bị.
Stephen Kidson

@StephenKidson, tôi đang sử dụng cùng một phiên bản appcompat và cũng gặp phải vấn đề tương tự trên một thiết bị không rõ thương hiệu. Bạn đã quản lý để giải quyết điều này? Tôi tự hỏi nếu có lỗi báo cáo về vấn đề này ...
Nimrod Dayan

4
Điều này không hoạt động trên trình giả lập Android 4.0 sử dụng appcompat-v7: 25.1.0.
Peterdk

4
AppCompatImageView không thể được sử dụng trong một Widget. Sử dụng setColorFilter trên ImageView.
Massimo

46

Bạn có thể đạt được điều đó bằng cách sử dụng mã nguồn. Trước đây pha màu không được hỗ trợ bởi DrawableCompat. Bắt đầu từ thư viện hỗ trợ 22.1, bạn có thể làm điều đó, nhưng bạn cần làm theo cách sau:

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

18
Nếu bạn cần hỗ trợ pha màu trên <21 API, thì bạn có thể muốn sử dụng ContextCompat.getColor()thay thế getResources().getColor().
Sevastyan Savanyuk

22

Bạn không thể chỉ sử dụng ImageView để hiển thị Drawable của mình? android:tinthoạt động tốt trên các cấp API cũ hơn.

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

2
Tôi đang sử dụng ImageView - để hiển thị biểu tượng trong đó. Các biểu tượng đó là một phần của các phần tử trong ngăn điều hướng của tôi. Và mục đã chọn trong ngăn điều hướng có màu khác nhau, vì vậy tôi đã tạo từng biểu tượng được tô màu và cũng có bộ chọn cho từng biểu tượng. Và tôi đang sử dụng bộ chọn đó cho biểu tượng của mình. Bộ chọn:<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

@Orochi Hãy xem câu trả lời của tôi vì nó đến trực tiếp từ các blog của Google. Nó chủ yếu chỉ hoạt động trên Android 5.0+ nhưng có thể hoạt động trên một số tiện ích cho các thiết bị chạy trước Android 5.0.
Jared Burrows

@Orochi Bạn sẽ phải thực hiện các chế độ xem tùy chỉnh để "mô phỏng" hiệu ứng tương tự.
Jared Burrows

1
Bạn có thể sử dụng chế độ xem hình ảnh, làm cho biểu tượng càng trắng càng tốt và làm cho nó có bất kỳ màu nào bạn muốn với iv.setColorFilter (yourColor, Mode.Multiply); Đảm bảo rằng bạn nhập android.graphics.PorterDuff.Mode
jb15613

3
Cùng một vấn đề ở đây. Đáng buồn là các màu với selector không làm việc với api <21
Luccas

17

Một câu hỏi tương tự đã được hỏi trước đây tại đây: https://stackoverflow.com/a/26533340/950427

Android Drawable Tinting chỉ được hỗ trợ trong Android 5.0+ (API 21+). (Nó nói " At the moment this is limited to coloring the action bar and some widgets.").

Chủ đề

...

Khi bạn đặt các thuộc tính này, AppCompat sẽ tự động truyền các giá trị của chúng đến các thuộc tính khung trên API 21+. Thao tác này sẽ tự động tô màu thanh trạng thái và mục nhập tác vụ Tổng quan (Gần đây).

Trên các nền tảng cũ hơn, AppCompat mô phỏng chủ đề màu nếu có thể. Hiện tại, điều này chỉ giới hạn trong việc tô màu thanh tác vụ và một số tiện ích.

Màu tiện ích

Khi chạy trên các thiết bị chạy Android 5.0, tất cả các widget đều được tô màu bằng cách sử dụng các thuộc tính chủ đề màu mà chúng ta vừa nói đến. Có hai tính năng chính cho phép điều này trên Lollipop: pha màu có thể vẽ và tham chiếu các thuộc tính chủ đề (có dạng? Attr / foo) trong các tệp có thể vẽ được.

AppCompat cung cấp hành vi tương tự trên các phiên bản Android trước đó cho một tập hợp con các tiện ích giao diện người dùng:

Mọi thứ được cung cấp bởi thanh công cụ của AppCompat (các chế độ hành động, v.v.) EditText Spinner CheckBox RadioButton Switch (sử dụng android.support.v7.widget.SwitchCompat mới) CheckedTextView Bạn không cần phải làm bất cứ điều gì đặc biệt để làm cho chúng hoạt động, chỉ cần sử dụng các điều khiển này trong bố cục của bạn như bình thường và AppCompat sẽ thực hiện phần còn lại (với một số lưu ý; xem Câu hỏi thường gặp bên dưới).

Nguồn:

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

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


Tại sao điều này bị phản đối? Đây là từ tài liệu chính thức.
Jared Burrows

Câu trả lời đã lỗi thời. ImageViewhiện cũng hỗ trợ android:tintthông qua AppCompat, như trong câu trả lời của @ Jonik.
Vicky Chijwani

@VickyChijwani Gửi bản chỉnh sửa. Và bạn có nghĩa là AppCompatImageView, không phải ImageView.
Jared Burrows


6

Đối với hình ảnh màu bạn có thể sử dụng imageView.setColorFilter(int color). Điều này hoạt động từ API 8 và hoạt động để tô màu hình ảnh màu đen của tôi thành màu tôi muốn. Điều này có thể thay thế setImageTintList()nhưng chỉ cần sử dụng android:tintcũng nên hoạt động.


4

Sử dụng NameSpace này
xmlns: app = "http://schemas.android.com/apk/res-auto"

và sau khi bạn có thể thay thế mọi android: tint bằng app: tint. Điều này khắc phục sự cố cho tôi.


4

Tôi đến muộn một chút nhưng đây là cách làm.

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

Điều này sẽ làm như bạn muốn và sẽ hoạt động trên tất cả các phiên bản Android của thư viện hỗ trợ:

@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

Nếu ai muốn tạo drawable mới (tin1, tint2 ..) hãy thử cái này

<?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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.