Dan*_*son 17 android android-appcompat android-vectordrawable
Android Studio 2.1版,gradle版本2.1.0,如果你发现任何曲解,请纠正我:)
我对支持库23.3.0中的支持向量感到困惑.具体来说,我想要的是以编程方式设置图像按钮,其src被定义为矢量drawable.据我所知,这在前棒棒糖上是不可能的.
我已经阅读了几篇关于这些变化的相关帖子: 23.2.0公告和变更:
从Android支持库23.3.0开始,支持向量drawable只能通过app:srcCompat或setImageResource()加载.
是否以上意味着矢量个XML只能通过srcCompat或setImageResource()被用于预棒棒糖,因此不能动态着色?
这是我的基本图像按钮:
<ImageButton
android:id="@+id/nav_header_exit_community_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:background="@null"/>
Run Code Online (Sandbox Code Playgroud)
仅适用于棒棒糖及以上:
Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
DrawableCompat.setTint(bg, headerTitleColor);
exitButton.setImageDrawable(bg);
Run Code Online (Sandbox Code Playgroud)
试图这个前棒棒糖投掷:
android.content.res.Resources$NotFoundException: File res/drawable/ic_exit_to_app_24dp.xml from drawable resource ID #0x7f0200bf
也适用于棒棒糖及以上
Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
DrawableCompat.setTint(bg, headerTitleColor);
exitButton.setImageResource(R.drawable.ic_exit_to_app_24dp);
Run Code Online (Sandbox Code Playgroud)
这会给前Lollipop带来同样的错误.
但是,如果我删除vectorDrawables.useSupportLibrary = true的指出,由伊恩·湖这里,与具有生成工具自动生成预棒棒糖设备png格式,的意图的PNG图像不会在预棒棒糖着色,所以我又回到了起点.
我也试图通过指定载体srcCompat和编程检索,但我不认为我已经能够做到这一点,尽管它适用于后棒棒糖如果使用指定的载体src来代替.
所以23.3.0的情况似乎是:
Post-Lollipop:src和srcCompat接受向量,只能src从视图中检索为可绘制的用于编程的着色.使用getDrawable可以在代码中引用向量,并且可以对它们进行着色.
Pre-Lollipop:srcCompat只能接受向量,不能从视图中以编程方式检索. setImageResource可以接受矢量,但仅限于vectorDrawables.useSupportLibrary = false,并且着色不起作用.类似地,代码中的引用向量是不可能的,除非vectorDrawables.useSupportLibrary = false并且着色不起作用.
使用png处理所有版本:
Drawable bg = ContextCompat.getDrawable(a, R.drawable.ic_nav_exit_community);
DrawableCompat.setTint(bg, headerTitleColor);
exitButton.setImageDrawable(bg);
Run Code Online (Sandbox Code Playgroud)
附录:
这种技术也适用于棒棒糖后,但与前棒棒糖上的其他技术一样,我得到了可绘制的,但没有着色:
Drawable bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null);
DrawableCompat.setTint(bg, headerTitleColor);
exitButton.setImageDrawable(bg);
Run Code Online (Sandbox Code Playgroud)
解决方案:
由于约翰的回答至今唯一很简单的方法,我可以拿出来着色,支持向量是设置彩色滤光片就可以了-这意味着该DrawableCompat.setTint()功能似乎是不适合我的功能,如果有问题的绘制是支持向量.我不确定这是一个合法的错误,预期的行为还是我只是做错了什么!
这是我现在要解决的问题:
Drawable bg;
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
bg = VectorDrawableCompat.create(a.getResources(), R.drawable.ic_exit_to_app_24dp, null);
exitButton.setColorFilter(headerTitleColor, PorterDuff.Mode.MULTIPLY);
}
else {
bg = ContextCompat.getDrawable(a, R.drawable.ic_exit_to_app_24dp);
DrawableCompat.setTint(bg, headerTitleColor);
}
exitButton.setImageDrawable(bg);
Run Code Online (Sandbox Code Playgroud)
psk*_*ink 32
首先你应该使用VectorDrawableCompat#create,一旦你有Drawable你必须打电话DrawableCompat#wrap:
通过本课程中的着色方法,潜在地包装drawable,以便它可以用于跨不同API级别的着色.
所以你的代码看起来像这样:
ImageView iv = ....
Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.ic_exit_to_app_24dp, null);
d = DrawableCompat.wrap(d);
DrawableCompat.setTint(d, headerTitleColor);
iv.setImageDrawable(d);
Run Code Online (Sandbox Code Playgroud)
您可以使用ImageView的setColorFilter方法:
imageView.setColorFilter(headerTitleColor, android.graphics.PorterDuff.Mode.MULTIPLY);
| 归档时间: |
|
| 查看次数: |
6627 次 |
| 最近记录: |