@linux1s1s
2019-02-15T15:35:38.000000Z
字数 1200
阅读 2613
AndroidImage
2015-07
一般我们在resource目录中新建一个colors.xml文件,然后再其中定义我们需要的颜色,比如:
<resources>
<drawable name="translucent_background">#99000000</drawable>
<color name="title_background">#ff449922</color>
</resources>
我们知道前面的两位代表Android的透明度,这里也就暗示了android图片的位数 AGRB_8888 也就是32位,然后我们继续延伸下去,计算一下一般JPG图片经过BitmapFactory.decodeStream(...)以后大概占有Java Heap的内存大小:
对于600*600分辨率的JPG图片
600 * 600 * 32 bit/ 8 /1024 / 1024 (MB)
我们再简化一下:
图片长度 * 图片宽度 * 单位像素占用的字节数 / 1000 / 1000 (MB)
而AGRB 单位像素占有的字节数为4
于是 一张 600*600*4/1000/1000 = 1.44 MB
----->>
如果在使用BitmapFactory.decodeStream(...)的时候采用GRB_565的方式,那么同样一张图占有的内存会减小到原有内存的1/2 也就是 600*600*2/1000/100 = 0.72MB, 如果对于上面的这些计算有什么疑问可以进一步看这篇博客:Android中图片占用内存的计算
接着看透明度的问题,一般透明度对应关系:
透明度为0 --->> 0xFF
透明度为50% --->> 0xFF*0.5 = 255*0.5= 0x80
透明度为25% --->> 0xFF*0.25 = 255*0.25 = 0x3f
透明度为60% --->> 0xFF*0.6 = 255*0.6 = 0x99
等等
小结公式: 0xFF * 透明度比例
接下来我们来看看渐变透明度如何处理(这里的渐变是指随着相关View的上下或者左右滚动而透明度发生改变)
这里的实现很简单,比如我们希望最终的 颜色值: 0xf23cb147
我们直接写个简单的方法即可:
private void updateTitleBg(int offset){
if(offset > mBannerHeight){
offset = mBannerHeight;
}
if(offset < 0){
offset = 0;
}
float ratio = 1.0f * offset / mBannerHeight;
int b = 0x01000000 * (int)(0xf2 * ratio) + 0x003cb147;
mTitleBg.setBackgroundColor(b);
}
关键的一行代码: int b = 0x01000000 * (int)(0xf2 * ratio) + 0x003cb147; 仅对透明度做渐变处理,范围是从 0x00(全透明) -- 0xf2