api的可绘制着色<21

时间:2015-03-19 21:37:15

标签: android

是否可以对api进行可绘制的着色工作? 21?

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

工作正常但仅适用于使用API​​21的设备。针对较低api设备或AppCompat支持的任何解决方法?找不到任何东西。

10 个答案:

答案 0 :(得分:97)

像这样使用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中的body { padding: 1em; } .change-content { cursor: pointer; display: block; width: 100%; padding: 0.48em 1em; } .change-content:after { content: 'Hello'; } .change-content:hover:after { content: 'World'; }

答案 1 :(得分:39)

您可以使用源代码实现这一目标。 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));

答案 2 :(得分: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"
    />

答案 3 :(得分:17)

此前有人问过类似的问题:https://stackoverflow.com/a/26533340/950427

Android Drawable Tinting仅在Android 5.0+(API 21+)中受支持。 (确实说&#34; At the moment this is limited to coloring the action bar and some widgets.&#34;)。

  

主题化

     

...

     

设置这些属性时,AppCompat会自动传播   它们对API 21 +上的框架属性的值。这个   自动为状态栏和概述(最近)任务条目着色。

     

在较旧的平台上,AppCompat会在其中模拟颜色主题   可能。目前这只限于着色动作栏和   一些小部件。

  

小工具着色

     

在使用Android 5.0的设备上运行时,所有的   使用我们刚才谈到的颜色主题属性对小部件进行着色   关于。 Lollipop有两个主要功能:   可绘制着色和引用主题属性(表单的主题)   ?attr / foo)in drawables。

     

AppCompat在早期版本的Android上提供类似的行为   对于UI小部件的子集:

     

AppCompat工具栏提供的所有内容(动作模式等)   EditText Spinner CheckBox RadioButton Switch(使用新的   android.support.v7.widget.SwitchCompat)CheckedTextView你不需要   做一些特殊的事情来使这些工作,只需使用这些控件   像往常一样你的布局和AppCompat将完成其余的工作(有些   注意事项;请参阅下面的常见问题解答。)

来源:

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

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

答案 4 :(得分:13)

现在AppCompatImageView,AppCompatButton将替换ImageView,Button以支持具有较低API的设备上的色调。查看链接了解更多详情 AppCompatImageViewAppCompatButton

答案 5 :(得分:6)

对于着色图像,您可以使用imageView.setColorFilter(int color)。这适用于API 8,用于将我的黑色图像着色为我想要的颜色。 这可以取代setImageTintList(),但只使用android:tint也可以。

答案 6 :(得分:2)

使用此NameSpace
的xmlns:应用= “http://schemas.android.com/apk/res-auto”

之后你可以用app:tint替换每个android:tint。这解决了 我的问题。

答案 7 :(得分: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
}

答案 8 :(得分:0)

我来晚了,但是这是怎么做。

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)
}

答案 9 :(得分:0)

如果有人要创建新的可绘制对象(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>