原创文章,转载请注明出处:http://blog.youkuaiyun.com/jyxpm/article/details/8562583
前几天在测试应用的时候发现,把渐变png做为背景的时候,在模拟器或设备上运行均出现光晕、波纹状的轮廓图,图片显示严重失真,困惑了很久。首先在网上搜解决方案,无外乎有下面几种办法:
1、在Activity的onCreate()函数中,super.onCreate()和setContentView()之间添加:
getWindow().setFormat(PixelFormat.RGBA_8888); //或者PixelFormat.TRANSLUCENT
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
或者用代码添加背景图片:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap gradient = BitmapFactory.decodeResource(getResources(), R.drawable.splash, options);
findViewById(R.id.linear).setBackgroundDrawable(new BitmapDrawable(gradient));
RGBA_8888为android的一种32位颜色格式,R,G,B,A分别用八位表示,Android默认格式是PixelFormat.OPAQUE,其是不带Alpha值的。设置之后可以看到图片的显示效果就和在PC上看到一样,不会出现带状的轮廓线了。
注:测试无效,可能跟我的程序有关。
2、第二种方法比较麻烦,就是将你需要要显示的view设置为一个surfaceview,这样也可以达到同样的显示效果,但这种方法代价较大,不推荐。
注:这个方法网上有源码,比较麻烦,没有测试。
3、如果以上方法依然不能实现去除手机中图片显示渐变存在光晕效果的话,你可以适一下在PS里的处理方法:“The best way to resolve this is to add some "noise" to your image asset in Photoshop or Paint.NET”我用了这个方法数值设置的是1.5。算是解决了问题。虽然手机开发的很多情况下会使用.png格式,但是当图片大小与质量并不匹配的时候,或许可以换一种文件格式,在这里建议使用jpg的,压缩大小与质量相衬。
注:可以解决问题,唯一不好的是图片质量受损,如果对图像质量要求没那么高,可以使用这种方法。noise参数设置为0.5-1.5之间较合适。
4、经过上面三种方法均无效之后,本人测试了N种图片格式,包括jpg、png-8、png-24等,甚至修改了图片参数,还是不能解决问题。最后研究了一下png,发现32位的png图片波纹明显减少,因此把所有图片替换成32位png,问题基本解决。
注:可以大幅度优化图片显示,不是100%完美。32位png制作窍门:如果带透明通道的直接保存就是32位的,没有透明通道的可以随便选一个像素,把像素透明度设置为99%,重新保存,OK。
32位png制作窍门:如果带透明通道的直接保存就是32位的,没有透明通道的可以随便选一个像素,把这个像素透明度设置为99%,重新保存,OK。