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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章