前段日子,公司要做一个图片浏览相关的APP,经过20来天的奋战,总算把项目赶出来。拿着Demo过去让产品经理体验的时候,产品不知道为啥脑抽了,说用户使用全屏浏览图片的时候把顶部状态栏都隐藏了,他突然想看时间了怎么办?然后就要求把顶部状态栏显示出来,同时在图片中间显示时间。震惊!既然顶部状态栏都显示了,为啥还得在图片上再加一个textview来展示时间?
又经过长时间的奋斗后,把修改后的Demo再次递给产品,他一看,说如果图片颜色太深或者太浅,会导致顶部状态栏和图片上的字都不容易看清楚,接着再次提出需要顶部状态栏和图片上的字要根据图片的颜色来改变。我头都想给他打爆,但是想着如今的经济形势和花呗,借呗,信用卡,只能无奈接受。
在我有限的知识库了,突然想到了要识别图片颜色的库,好像还真有一个——Palette。
初识Palette还是在学校的时候,那会老师要求我们做一个调色板,搜索资料的时候刚好看到,那时候的Palette还是V7包的,现在都出了AndroidX了。抱着回头复习的心态,我沉下心来翻看了Palette的资料。
首先引入,我使用的是AndroidX:
implementation 'androidx.palette:palette:1.0.0'
然后是使用,palette的实例对象需要通过Bitmap的实例对象来生成,也很好理解,因为Palette就是同过对像素的采集来统计来告诉我们图片的颜色情况。代码如下:
var bitmap = BitmapFactory.decodeStream(“fileName路径 or 图片Id”)var builder = Palette.from(bitmap)var palette = builder.generate()例如:var bitmap = BitmapFactory.decodeStream("file:///android_asset/1.png") 或者var bitmap = BitmapFactory.decodeResource(resources,R.mipmap.panda_test)var builder = Palette.from(bitmap)var palette = builder.generate()
当我们拿到了Palette的对象后,我们就可以通过以下的方法来获取对应的颜色状态:
val vibrant: Swatch? = palette.vibrantSwatch //获取充满活力的色调val darkVibran: Swatch? = palette.darkVibrantSwatch //获取充满活力的黑val lightVibran: Swatch? = palette.lightVibrantSwatch //获取充满活力的亮val muted: Swatch? = palette.mutedSwatch //获取柔和的色调val darkMuted: Swatch? = palette.darkMutedSwatch //获取柔和的黑val lightMuted: Swatch? = palette.lightMutedSwatch //获取柔和的亮val dominantMuted: Swatch? = palette.dominantSwatch //获取主色调
由于我的要求是更新状态栏的字体颜色,所以我只要找到图片的主色调,判断它是深还是浅,对应修改状态栏的字体颜色是白还是黑就好,同时修改图片显示的文字颜色就可以。
这里我提供一下修改状态栏的代码:
//状态栏字体黑色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}//状态栏字体白色if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}
然后是颜色的判断依据代码,我是根据灰阶来判断,代码如下:
val red = color and 0xff0000 shr 16val green = color and 0x00ff00 shr 8val blue = color and 0x0000ffval gray = (red * 0.299 + green * 0.587 + blue * 0.114).toInt()if (gray >= 192) {// 浅色系}else{// 深色系}
就这样我把产品经理的奇葩需求解决了,同时我也把之前的Palette知识又捡了回来。对于这种无理奇葩的需求其实最重要的还是要把自己的心态摆正,只要自己的心态稳如老狗,以后对于各种各样的需求就能平静待之。最后把效果展示一下,如果有帮到各位大佬,请不要吝惜收藏点赞哈!