图片优化

安卓图片优化:
(1) 不要将 Button的背景设置成 selector
    如果将 Button的背景设置成 selector,在初始化Button的时候会将正反选图片都加载在内存中,相当于一个按钮占用了
两张相同大小图片所使用的内存
可以通过在布局文件中给按钮设置正常状态下的背景图片,然后在代码中监听按钮的点击状态,当按下按钮时为按钮设置
反选效果的图片,抬起时重新设置为正常状态下的背景
ImageButton personalInfoBtn = (ImageButton) findViewById(R.id.personalInfoBtn);
personalInfoBtn.setOnTouchListener(new OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();

if (action == MotionEvent.ACTION_DOWN) {
((ImageButton) v).setColorFilter(getResources().getColor(0X50000000));
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
((ImageButton) v).clearColorFilter();
}

// 为了不影响监听按钮的 onClick回调,返回值为false
return false;
}
});

(2) 将背景图片放在非UI线程绘制,提升APP的效率
在高分辨率的平板设备上,绘制大背景的图片会影响程序的运行效率,严重情况下就和没有开硬件加速的时候使用手写功能一样
,相当地卡,最后我们的解决方案是将背景图片通过SurfaceView来绘制,这样相当于是在非UI线程绘制,不会影响到UI线程做其它事
情:

(3) 没有必要使用硬件加速的界面建议关掉硬件加速
通过DDMS的heap跟踪发现,相比于关闭硬件加速,在打开硬件加速的情况下会消耗更多的内存,但有的界面打开或者关闭硬件加速
并没有太大的影响,此种情况下可以考虑在AndroidManifest.xml文件中关闭掉对应Activity的硬件加速,like this:
<!-- 设置界面 -->
<activity
android:name=".SettingActivity"
android:hardwareAccelerated="false"
android:screenOrientation="sensorLandscape"
android:theme="@style/Translucent_NoTitle">
</activity>
注意:如果使用到WebView、视频播放、手写、动画等功能时,关掉硬件加速器会严重影响程序的运行效率,这种情况可以只关闭
Activity中某些view的硬件加速,整个Activity的硬件加速不必关闭
如果Activity中某个View需要关闭硬件加速,但整个Activity不能关闭,可以调用view层级关闭硬件加速的方法:
setLayerType(View.LAYER_TYPE_SOFTWARE, null);

(4) 尽量少用 AnimationDrawable,如果必须要可以自定义图片切换器代替AnimationDrawable
AnimationDrawable 也是一个消耗内存的大户,图片帧数越多耗内存越大。在AnimationDrawable实例化的时候,
Drawable的createFromXmlInner方法会调用AnimationDrawable的inflate方法,该方法里面有个while循环去一次性
将所有的帧都读取出来,有多少张图片,它就要消耗对应大小的内存。
常情况下我会自定义一个ImageView来实现AnimationDrawable的功能,根据图片之间切换的时间间隔来定时设置
ImageView的背景图片,这样始终只是一个ImageView实例,更换的只是其背景,占用内存会比AnimationDrawable小很多


(5) 其他优化方式
① 尽量将Activity中的小图片和背景合并,一张小图片既浪费布局的时间,又平白地增加了内存占用
② 不要在Activity的主题中为Activity设置默认的图片,这样会导致Activity占用的内存翻倍
<style name="Activity_Style" parent="@android:Theme.Holo.Light.NoActionBar">
<item name="android:background">@drawable/***</item>
</style>
③ 对于在需要时才显示的图片或者布局,可以使用ViewStub标签,通过 sdk/tools 目录下的 hierarchyviewer.bat查看
布局文件会发现,使用viewstub标签的组件几乎不消耗布局的时间,在代码中当需要显示时再去实例化有助于提高 Activity

的布局效率和节省 Activity消耗的内存

Bitmap优化策略
1、BitmapConfig的配置
2、使用decodeFile、decodeResource、decodeStream进行解析Bitmap时,配置 inDensity 和 inTargetDensity,两者
应该相等,值可以等于屏幕像素密度 * 0.75f
3、使用inJustDecodeBounds预判断 Bitmap的大小及使用 inSampleSize进行压缩
4、对Density > 240的设备进行 Bitmap的适配(缩放Density)
5、2.3版本 inNativeAlloc的使用
6、4.4以下版本 inPurgeable、inputShareable的使用
7、Bitmap的回收,调用 recycle()方法

总结:
① 对图片质量进行压缩
② 对图片尺寸进行压缩
③ 使用 libjpeg.so库进行压缩
libjpeg是广泛使用的开源JPEG图像库,Android所用的是skia的压缩算法,而Skia对libjpeg进行了封装。
libjpeg在压缩图像时,optimize_coding=TRUE,将会使得压缩图像过程中基于图像数据计算哈夫曼表,由于这个计算会
显著消耗空间和时间,默认值被设置为FALSE
④ 用合适的色彩模式加载图片(ARGB_44444、RGB_565)
⑤ 调用图片的 recycle()办法
⑥ 使用Matrix对象放大的图片如何更改色彩模式
Matrix matrix = new Matrix();
float newWidth = 200;
float newHeight = 300;
matrix.postScale(newWidth / img.getWidth(), newHeight / img.getHeight());
Bitmap img1 = Bitmap.createBitmap(
img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); // 获得放大图片
img2 = img1.copy(Bitmap.Config.ARGB_4444, false); // 获得 ARGB_4444色彩模式的图片
img = null;
img1 = null;
⑦ 尽量不要使用 setImageBitmap 或 setImageResource或 BitmapFactory.decodeResource来设置一张图片,改用先通过
BitmapFactory.decodeStream方法,创建出一个 bitmap, 再将其设置为 ImageView的 source

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值