根据缩放比将图片加载到内存中
主要通过使用 Bitmap 的 compress 方法对磁盘上的图片进行压缩,并且存储到内存中:
1. ByteArrayOutputStream bos = new ByteArrayOutputStream();
2. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
3. byte[] bitmapdata = bos.toByteArray();
上面代码中的 100 表示与原图保持相同的质量,控制其大小能有效减少对内存空间的占用。但是要注意,在改变 compress 方法中的质量参数的时候,压缩格式应该是 JPEG。若压缩格式被设置为 PNG,则任何修改都是无效的。
4.列表图片很多时,快速来回滑动会卡顿
无论是用 ListView 还是用 RecyclerView 作为列表的承载,当信息流中的每个 item 项都有图片且图片比较大时,快速来回上下滑动,很多时候会发生页面掉帧厉害的现象,也就是出现了列表卡顿。究其原因是,在列表高速滑动的时候,已经在子线程中加载好的图片会在主线程中被重新绘制到 ImageView 控件上。由于上下来回高速滑动,将导致 item 项频繁重用和销毁,进而导致图片中的 Bitmap 被频繁地创建和销毁。因此,解决方案就是,在列表发生滚动的情况下,暂停加载当前 ImageView 中的图片(包括下载、解码、设置等一系列操作);在列表停止滚动后,恢复 ImageView 中图片的下载任务(也包含下载、解码、设置等一系列操作)。
针对 ListView
1. listView.setOnScrollListener(new AbsListView.OnScrollListener() {
2. @Override
3. public void onScrollStateChanged(AbsListView view, int scrollState) {
4. switch (scrollState){
5. case SCROLL_STATE_FLING:
6. //暂停图片加载
7. break;
8. case SCROLL_STATE_IDLE:
9. //恢复图片加载
10. break;
11. }
12. }
13.
14. @Override
15. public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
16.
17. }
18. });
针对 RecyclerView
1. recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
2. @Override
3. public void onScrollStateChanged(RecyclerView recyclerView, int
newState) {
4. switch (newState) {
5. case RecyclerView.SCROLL_STATE_IDLE:
6. //恢复图片加载
7. break;
8. case RecyclerView.SCROLL_STATE_SETTLING:
9. //暂停图片加载
10. break;
11. }
1