1、针对每一种情形,切一张对应的图标。

2、只切一张图标,根据条件改变图标颜色。

第一种方式就很简单,直接根据条件设置对应的图标就好 —— imageView.setImageResource(iconRes)

这里着重介绍一下第二种实现方式。

1、通过setColorFilter实现

这种方式最简单  ——  cityWeatherBinding?.ivAirNum?.setColorFilter(aqiIconColor)

代码只是改变颜色,在xml布局中需要设置源图标。

<ImageView
android:id="@+id/iv_air_num"
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_14"
android:src="@drawable/ic_icon_aqi"/>

2、通过DrawableCompat实现

//图标需要改变的颜色

val up = ContextCompat.getDrawable(context!!,R.drawable.ic_icon_aqi);

if (up != null) {

val drawableUp = DrawableCompat.wrap(up)

DrawableCompat.setTint(drawableUp, ContextCompat.getColor(context!!, aqiIconColor))

cityWeatherBinding?.ivAirNum?.setImageDrawable(drawableUp)

3、通过VectorDrawableCompat实现

需要使用svg格式的图标

ic_icon_air.xml如下

<vector android:height="24dp" android:viewportHeight="36"
    android:viewportWidth="36" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#7ACC7A" android:fillType="nonZero"
        android:pathData="M10.0284,32C7.6297,31.8532 6.376,31.1095 5.7318,30.2835C5.8552,28.2734 6.213,25.7695 7.218,23.4972C7.794,22.1961 8.6122,21.0178 9.6152,20.1522C10.7122,19.1203 11.7257,18.3256 12.7468,17.6709C14.7625,16.3865 16.5308,15.8267 17.0907,15.6295C17.6563,15.4416 18.6712,15.0884 19.8997,14.6954C21.1238,14.3343 22.6067,13.8122 23.8723,13.1741C26.4674,11.9528 28.6183,10.5749 28.6145,10.5744C28.6193,10.5749 26.3192,11.6719 23.6474,12.582C22.2994,13.0767 20.9218,13.4021 19.6362,13.6581C18.3706,13.9379 17.3023,14.2232 16.7137,14.4189C15.6135,14.8143 9.021,16.6297 5.6536,22.7152C4.8921,24.2693 4.4142,25.8772 4.1049,27.3838C3.3434,27.0144 2.3961,26.2985 2.1379,24.9744C1.6881,22.6668 1.9383,15.7435 9.2292,11.8975C16.5208,8.0515 24.6609,8.8202 28.5564,7.6923C32.4518,6.5645 34,4 34,4C34,4 30.7541,30.103 10.0284,32Z"
        android:strokeColor="#00000000" android:strokeWidth="1"/>
</vector>

         //使用svg格式图片,然后动态改变背景色
         vectorDrawableCompat = VectorDrawableCompat.create(it.resources, R.drawable.ic_icon_air, it.theme) 

         vectorDrawableCompat?.let {

               it.setTint(ContextCompat.getColor(CommonManager.getBaseContext(), aqiIconColor))               

               cityWeatherBinding?.ivAirNum?.setImageDrawable(it)

  注:第三种方式可能会出现异常:android.content.res.Resources$NotFoundException。

    android.content.res.Resources$NotFoundException: File res/drawable-xxhdpi-v4/ic_icon_air.png from xml type xml resource ID #0x7f07006c
        at android.content.res.Resources.loadXmlResourceParser(Resources.java:3289)
        at android.content.res.Resources.loadXmlResourceParser(Resources.java:3244)
        at android.content.res.Resources.getXml(Resources.java:1486)
        at android.support.graphics.drawable.VectorDrawableCompat.create(VectorDrawableCompat.java:646)
        at com.xxx.mvvm.viewModel.CityWeatherViewModel.<init>(CityWeatherViewModel.kt:62)
        at com.xxx.home.module.main.CityWeatherFragment.getViewModel(CityWeatherFragment.kt:133)
        at com.xxx.home.module.main.CityWeatherFragment.getViewModel(CityWeatherFragment.kt:67)
        at com.xxx.common.app.BaseVMFragment.onCreateView(BaseVMFragment.kt:30)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
        at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
        at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1244)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:669)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:631)
        at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:1086)
        at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:3097)
        at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:291)
        at com.xxx.home.module.main.HomeFragment.notifyDataChanged(HomeFragment.kt:123)
        at com.xxx.home.module.main.HomeFragment.performDataRequest(HomeFragment.kt:116)
        at com.xxx.common.app.KiiBaseFragment$onViewCreated$1.run(KiiBaseFragment.kt:59)
        at android.os.Handler.handleCallback(Handler.java:815)
        at android.os.Handler.dispatchMessage(Handler.java:104)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5975)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
有人说,直接监听按钮的按下事件不得了嘛,其实这样确实能实现同样的效果,但是有个缺点,比如很多按钮都需要这样的效果,那你同样的代码就要重复很多次。所以,还是要通用起来。 首先,在res文件夹下新建一个文件夹drawable,这是无关分辨率的: 在下面建立一个xml文件:login_button_selector.xml 代码如下:<selector xmlns:android=”http://schemas.android.com/apk/res/android”> Android 开发中Drawerable的Selector文件用得很频繁,有时候图标文件只有默认的,缺少选中状态或是按下状态的图标资源,这个时候就需要用代码改变图标颜色,动态生成Selector文件改变图标颜色主要就是改变画笔的颜色重新绘制 验证像素点的alpha值,是否透明 在不透明的像素点上修改为我们想要的颜色 根据输入的颜色改变图标颜色final EditText et = findViewById(R.id.et); final ImageView iv = findViewById(R.id.iv); iv.setOnClickListener(new View.OnClickListene 通过若干种方法来实现状态栏背景和图标变色 注意事项:api 23才支持状态栏图标变色,所以图标变色会在编译api&amp;gt;=23中实现 https://stackoverflow.com/questions/33316668/how-to-change-the-status-bar-notification-icons-color-tint-in-android-marshmal/33316669 有时ui给了我们一个图标颜色,但是我们需要另一种颜色,这个时候我们可以通过代码来改变图标颜色使用imageview.setcolorFilter(int color)即可达到效果,但是有几点需要注意:1.imageview设置的图标必须是通过setImageResource设置的,如果是通过backgroundresource无效2.参数 color必须是系统默认的颜色,即Color中的int... 实现方式:通过实现滤镜效果.setColotFilter(颜色,模式),从而达到更改图标颜色mFirstImage = (ImageView)findViewById(R.id.first_image);mFirstImage.setColorFilter(Color.parseColor("#00FF00"), PorterDuff.Mode.LIGHTEN);//方法效果清除mFirstIma... * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You ... 在res目录下新建一个color目录,然后在这个color目录下新建一个selector_upgrade_ic_press xml文件。selector_upgrade_text_press xml文件。 同一个图标,但是可能会有多种背景颜色。比如,标识空气质量的图标,因空气质量有多种情形,对应的图标就有多种背景颜色。实现这种需求有两种方式:1、针对每一种情形,切一张对应的图标。2、只切一张图标,根据条件改变图标颜色。第一种方式就很简单,直接根据条件设置对应的图标就好 —— imageView.setImageResource(iconRes)这里着重介绍一下第二种实现方式。源图标1、通过setCo... mFirstImage = (ImageView)findViewById(R.id.first_image); mFirstImage.setColorFilter(Color.parseColor("#00FF00"), PorterDuff.Mode.LIGHTEN); //方法效果清除...