飞道的博客

android改变图标颜色

626人阅读  评论(0)

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

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

        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如下


  
  1. <vector android:height= "24dp" android:viewportHeight= "36"
  2. android:viewportWidth= "36" android:width= "24dp" xmlns:android= "http://schemas.android.com/apk/res/android">
  3. <path android:fillColor="#7ACC7A" android:fillType="nonZero"
  4. 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"
  5. android:strokeColor= "#00000000" android:strokeWidth= "1"/>
  6. </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。


  
  1. android.content.res.Resources$NotFoundException: File res/drawable-xxhdpi-v4/ic_icon_air.png from xml type xml resource ID #0x7f07006c
  2. at android.content.res.Resources.loadXmlResourceParser(Resources. java: 3289)
  3. at android.content.res.Resources.loadXmlResourceParser(Resources. java: 3244)
  4. at android.content.res.Resources.getXml(Resources. java: 1486)
  5. at android.support.graphics.drawable.VectorDrawableCompat.create(VectorDrawableCompat. java: 646)
  6. at com.xxx.mvvm.viewModel.CityWeatherViewModel.<init>(CityWeatherViewModel. kt: 62)
  7. at com.xxx.home. module.main.CityWeatherFragment.getViewModel(CityWeatherFragment. kt: 133)
  8. at com.xxx.home. module.main.CityWeatherFragment.getViewModel(CityWeatherFragment. kt: 67)
  9. at com.xxx.common.app.BaseVMFragment.onCreateView(BaseVMFragment. kt: 30)
  10. at android.support.v4.app.Fragment.performCreateView(Fragment. java: 2439)
  11. at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager. java: 1460)
  12. at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager. java: 1784)
  13. at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager. java: 1852)
  14. at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord. java: 802)
  15. at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager. java: 2625)
  16. at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager. java: 2411)
  17. at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager. java: 2366)
  18. at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager. java: 2243)
  19. at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord. java: 654)
  20. at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter. java: 168)
  21. at android.support.v4.view.ViewPager.populate(ViewPager. java: 1244)
  22. at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager. java: 669)
  23. at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager. java: 631)
  24. at android.support.v4.view.ViewPager.dataSetChanged(ViewPager. java: 1086)
  25. at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager. java: 3097)
  26. at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter. java: 291)
  27. at com.xxx.home. module.main.HomeFragment.notifyDataChanged(HomeFragment. kt: 123)
  28. at com.xxx.home. module.main.HomeFragment.performDataRequest(HomeFragment. kt: 116)
  29. at com.xxx.common.app.KiiBaseFragment$onViewCreated$1.run(KiiBaseFragment. kt: 59)
  30. at android.os.Handler.handleCallback(Handler. java: 815)
  31. at android.os.Handler.dispatchMessage(Handler. java: 104)
  32. at android.os.Looper.loop(Looper. java: 207)
  33. at android.app.ActivityThread.main(ActivityThread. java: 5975)
  34. at java.lang.reflect.Method.invoke(Native Method)
  35. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit. java: 789)
  36. at com.android.internal.os.ZygoteInit.main(ZygoteInit. java: 679)

 


转载:https://blog.csdn.net/gengbaolong/article/details/106096056
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场