[关闭]
@linux1s1s 2019-02-15T15:35:38.000000Z 字数 1200 阅读 2613

Android 关于透明度计算

AndroidImage 2015-07


透明度基础

一般我们在resource目录中新建一个colors.xml文件,然后再其中定义我们需要的颜色,比如:

  1. <resources>
  2. <drawable name="translucent_background">#99000000</drawable>
  3. <color name="title_background">#ff449922</color>
  4. </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
我们直接写个简单的方法即可:

  1. private void updateTitleBg(int offset){
  2. if(offset > mBannerHeight){
  3. offset = mBannerHeight;
  4. }
  5. if(offset < 0){
  6. offset = 0;
  7. }
  8. float ratio = 1.0f * offset / mBannerHeight;
  9. int b = 0x01000000 * (int)(0xf2 * ratio) + 0x003cb147;
  10. mTitleBg.setBackgroundColor(b);
  11. }

关键的一行代码: int b = 0x01000000 * (int)(0xf2 * ratio) + 0x003cb147; 仅对透明度做渐变处理,范围是从 0x00(全透明) -- 0xf2

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注