Android支持32bit的颜色,但是真正显示的时候(无论是模拟器还是手机),都是以16bit的颜色显示出来的。一般电脑液晶显示器为18bit,并且通过颜色抖动来模拟32bit真彩色。而Android所显示的内容都为16bit。对于bitmap中的一个pixel来说,会以RGB565的方式来转换。而对于drawable中的24bit png,大面积的同色区域会被转为不同颜色pixel的点阵以模拟24bit。所以,如果有自行创建的Bitmap和drawable无缝对接的时候,就会出现色差。解决方法:
1. 在Bitmap中使用16bit颜色,并且选择Android颜色索引表中的颜色(即Android转成RGB565之后的颜色,例如RGB206, 203, 206)
2. 对于png文件,至少要有一个像素为透明像素,这样可以迫使Android在转成Bitmap的时候不会全部转成RGB565,同时在PNG文件中使用的颜色也是Android颜色索引表中的颜色

解决方案 »

  1.   

    如果硬件支持32位,如何使ANdroid真正显示的时候也以32位显示出来?
      

  2.   

    Bitmap bm = BitmapFactory.decodeFile("/drawable/icon.png");
    这样应该是没问题的,不过你怎么知道不是32bit的而是16的呢?
      

  3.   

    领导说想把默认的16位输出改为32位输出,我现在所知道的是android会把ARGB8888转换为RGB565进行输出,但是不知道具体在哪进行了转换还有在skia里的skcolor.h文件里看到32位转16位的函数,不知道在哪被调用希望能详细给解答一下,谢谢了!
      

  4.   

    写错了,是skcolorpriv.h文件,