android改变图标颜色

同一个图标,但是可能会有多种背景颜色。比如,标识空气质量的图标,因空气质量有多种情形,对应的图标就有多种背景颜色。

实现这种需求有两种方式:

        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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值