Android 改变图片颜色几种方法

这篇具有很好参考价值的文章主要介绍了Android 改变图片颜色几种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、改变图片颜色的应用场景

一般来讲,同一个图标,在不同的页面和不同的场景,UI设计会用不同的颜色展示。或者不同的主题,使用不同的颜色,我们当然可以每种颜色都让UI切一张图,但一方面工作繁琐无比,另一方面应用场景狭隘,不利于扩展,每次有新设计或新主题时都需要新发布一个包。最后包体积也会大大增加,因而,同一张图标,通过代码实现动态更改颜色就有了必要。

本文中,主要讲图标颜色的更改,及一张图片整体处于同一色值时的修改。当然,若图标本身某些区域带着透明度,那么透明度也会延续下来,不会被更改。所以,如果图标是一张大块区域全不透明的图片,那么就不适用以下方案,因为使用后就是一张带图片轮廓的纯色色块。
如果是针对自己绘制的shape类型drawable,也可以通过代码动态设置其色值。
如果图片为svg时,我们也可以针对不同区域(path或group)设置不同的颜色,这需要我们对svg图的xml文件进行一定的了解,无法如同png类型一般直接设置色值即可。

二、更新图标颜色的方案

2.1 通过xml直接修改图标颜色

第一种 对src设置tint 这里需要注意tint因为版本兼容的原因要使用app标签

android:src="@drawable/ic_tag"
app:tint="@color/white"

第二种 对background设置backgroundTint

android:background="@drawable/ic_tag"
android:backgroundTint="@color/blue"

第三种 针对应用最低兼容安卓版本23的应用可设置foreground及foregroundTint

android:foreground="@drawable/ic_tag"
android:src="@drawable/ic_tag"
android:foregroundTint="@color/white"

  1. 由于foreground是前景,imageview并不会去获取其宽高设置为自身的宽高,所以在使用foreground时要么固定宽高,要么设置上src或background。并不推荐第三种方案来进行图标颜色的修改。
  2. 在设置tint的同时可以根据自己的需要去设置对应的tintMode,不同的mode,对图片所采用的颜色修改方式也不一样,如果只是纯粹将图标修改成另一个颜色,直接不进行设置使用默认即可

2.2 动态设置本地绘制shape类型drawable

一般来讲,本地绘制的shape都是设置到背景上,所以我们就可以进行以下设置:

val gd = view.background as? GradientDrawable
gd?.mutate() //重点注意,这里需要调用mutate()
//设置填充颜色,如果是纯色,直接设置color颜色即可,如果是渐变,则需要使用int数组设置到colors
gd?.colors = intArrayOf(bgColor,bgColor) 
//设置边框,第一个参数表示宽度,后面一个表示边框的颜色,有两种取值,直接color或colorStateList
gd?.setStroke(DisplayUtil.dip2px(1f), ColorStateList.valueOf(bgColor)) 

注:

  1. 由于Android系统的缓存,使用的资源resource drawable生成后,后续使用该资源都会直接调用该对象,如果我们在代码里面动态调整了该资源的颜色而没有设置了mutate(),那么后续调用的该资源色值都是动态设置后的颜色。但如果我们设置了mutate()则表示本次修改不进行缓存。同理,我们只要是针对drawable进行颜色的动态更新,都要考虑该方法的调用
  2. 对填充颜色的设置,需要注意纯色设置和渐变色设置,分别是color和colors,对应的参数分别是@ColorInt int color和@ColorInt int[] colors

2.3 代码动态设置图片颜色

第一种 对imageview设置colorfilter

imageview.setColorFilter(Color.parseColor(“#de1212”))

第二种 对imageview设置imageTintList

imageview.imageTintList = ColorStateList.valueOf(colorInt)

同xml,这里也可以设置backgroundTintList = ColorStateList.valueOf(colorInt)
如果某些控件图标是button(CheckBox),可使用buttonTintList = iconsColorStates
针对textview的drawable可使用:

textView.compoundDrawables.forEach {
            it?.mutate()
            it?.setTintList(ColorStateList.valueOf(Color.parseColor("#02724E")).withAlpha(153)) //设置带透明度的颜色
}

注:
关于ColorStateList,如果只是单纯的某个颜色就可以直接使用ColorStateList.valueOf(colorInt),如果想针对不同的状态设置不同的颜色,则可以用ColorStateList(int[][] states, @ColorInt int[] colors)进行设置。
例如:
ColorStateList(arrayOf(intArrayOf(-android.R.attr.state_checked),intArrayOf(android.R.attr.state_checked)), intArrayOf(iconRgb, iconSelectRgb))

拓展一下

ColorStateList可以设置不同状态下的颜色,那么有没有不同状态下使用不同的图标呢,当然是有的:StateListDrawable,它的使用方式类似ColorStateList,例如:

val stateListDrawable = StateListDrawable()
//按下背景 后一个参数为drawable类型
stateListDrawable.addState(intArrayOf(android.R.attr.state_pressed), pressBackGroundDrawable)
//选中背景
stateListDrawable.addState(intArrayOf(android.R.attr.state_selected), selectBackGroundDrawable)
//默认背景
stateListDrawable.addState(intArrayOf(), gradientDrawable)
view.background = stateListDrawable

上面不同状态所使用的drawable当然也可以运用上面列举的方法进行动态设置颜色。

2.4 对svg图进行动态颜色修改

有这样一张svg图,xml如下

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="25dp"
    android:height="25dp"
    android:viewportWidth="1024"
    android:viewportHeight="1024">
    <path
        android:name="border"
        android:fillColor="#FFFFFF"
        android:pathData="M512,0c255.41,0 462.45,207.05 462.45,462.45s-207.05,462.45 -462.45,462.45S49.55,717.86 49.55,462.45 256.59,0 512,0zM512,66.06C293.1,66.06 115.61,243.55 115.61,462.45s177.48,396.39 396.39,396.39 396.39,-177.48 396.39,-396.39S730.9,66.06 512,66.06z" />
    <path
        android:name="solid"
        android:fillColor="#22C96A"
        android:pathData="M512,66.06c218.9,0 396.39,177.48 396.39,396.39s-177.48,396.39 -396.39,396.39S115.61,681.36 115.61,462.45 293.1,66.06 512,66.06z" />
    <path
        android:name="center"
        android:fillColor="#FAFFFC"
        android:pathData="M444.12,534.66l237.47,-237.44a48.36,48.36 0,0 1,68.54 0.13c18.96,18.96 18.96,49.71 0.13,68.54l-268.98,268.95c-8.92,8.92 -20.38,13.64 -32.04,14.14a47.57,47.57 0,0 1,-39.21 -13.48l-136.36,-136.36a47.5,47.5 0,0 1,0.1 -67.39,47.86 47.86,0 0,1 67.39,-0.1l102.96,102.99z" />
</vector>

android 修改图标颜色,Android,android,安卓
其中有三条路径, border为最外层的白色圆环,solid为填充绿色区域, center为最中心的白色√
这三条路径里面,除去pathData是我们不能去修改的,其他都可以由我们开发自定义。

android:name 为当前path设置名称,后续代码里面通过该名称查找该path进行颜色修改
android:fillColor 为当前path的填充颜色,后续通过代码setFillColor(int Color)进行修改
android:strokeColor 为当前path的边框颜色,后续通过代码setStrokeColor(int Color)进行修改
还有诸如strokeAlpha、strokeWidth、fillAlpha,根据名字即可知晓其作用。

代码设置其色值,例子:

 VectorChildFinder selectedVector = new VectorChildFinder(context, R.drawable.vector_drawable_ico_selected, imageView);
 VectorDrawableCompat.VFullPath solid = selectedVector.findPathByName("solid");
 solid.setFillColor(iconColor);
 imageView.invalidate(); //重绘imageView

提出疑问:

如果一个svg图中有好些path都为相同的颜色,那么我们能不能将这些path命名为相同的名字,如果不能,那针对这种不同path动态设置相同颜色的情况,我们如何避免重复的findPathByName、setFillColor。除去findPathByName之外,还有一个findGroupByName方法,是否可以通过这个group找到办法?文章来源地址https://www.toymoban.com/news/detail-742331.html

到了这里,关于Android 改变图片颜色几种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 13 Hotseat定制化修改——002 hotseat图标数量修改

    目录 一.背景 二.实践方案 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher中,

    2024年02月13日
    浏览(67)
  • android resoure资源图片颜色值错乱

    最近androidstudio开发,添加一些颜色值或者drawable资源文件时,运行app,颜色值或者图片对应不上,暂时找不到原因,望告知。 暂时解决方法:  

    2024年02月12日
    浏览(36)
  • 怎么修改svg的颜色? img引入svg图片怎么修改颜色的三种方法

    效果图 此时css对svg文件无法生效,此时要用到CSS3滤镜filter中的drop-shadow,通过生产一个可指定颜色的阴影放置于svg的位置,并将原始svg移出视线 效果图 如果项目中用到svg比较多,前两种方法会比较啰嗦,每次写一遍方法二的样式比较麻烦,这时可以考虑封装组件, 结合实际需要

    2024年02月11日
    浏览(55)
  • Android逆向学习(二)vscode进行双开与图标修改

    这其实应该还是吾爱的第一个作业,但是写完上一个博客的时候已经比较晚了,如果继续敲机械键盘吵到室友,我怕我看不到明天的太阳,所以我决定分成两篇博客来进行学习 注意:我希望我的博客可以是不管是从那一篇开始看都可以学会,所以在我的每一篇博客中都会重复

    2024年02月09日
    浏览(49)
  • Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

    之前经常使用Spannable 这次主要在String.xml使用: ![CDATA[和]] 效果: 类里:    

    2024年02月02日
    浏览(45)
  • Android Button修改背景颜色及实现Button水波纹效果

    Android Button修改背景颜色及实现Button水波纹效果,效果如下:   以下基于API33(Android13.0),向下兼容至API24(Android7.0)。 我们可以发现在布局xml文件中直接修改background是没有作用的,会变成默认的主题色(themes.xml中的colorPrimary颜色,默认为紫色) 这是由于在Android4.1之后的

    2024年02月07日
    浏览(48)
  • Android studio中单击ImageButton按钮变换图片或颜色

    学习android studio后,掌握了TextView、Button、EditText、ImageView的使用。今天分享一下有关ImageButton图片按钮的使用,及单击ImageButton(按下、抬起)时变换不同的图片或颜色,希望可以对大家的学习有所帮助。 目录 一、 ImageButton简介 二、Android样式选择器 三、单击ImageButton按钮变

    2024年02月09日
    浏览(37)
  • Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示

    在14.0的系统rom产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: systemu

    2024年04月29日
    浏览(85)
  • Android 13 Hotseat定制化修改——005 hotseat图标禁止形成文件夹

    目录 一.背景 二.方案 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher中,本篇

    2024年02月13日
    浏览(57)
  • Android 13 Launcher——长按图标弹窗内容修改以及小组件等隐藏起来

    目录 一.背景 二.实现思路 三.布局文件修改 四.隐藏代码中原先的view 由于定制化开发需要将原先的长按图标原生弹窗界面隐藏,然后显示自定义的弹

    2024年02月13日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包