转载请注明出处:http://blog.csdn.net/woshizisezise/article/details/51484278
大家好,很长一段时间没有更新文章了,忙着在适应自己的新工作,今天才偶尔得闲,能够给大家分享一点干货,当然了,我写的这篇文章没有像其他的大牛们分析的那么具体到位,主要是我个人对Picasso这个新的图片加载框架的使用体验和感受的一点分析,也会说到一点他的工作原理啦,那么我们就开始体验吧~
首先我们要知道,在安卓应用中,加载图片的框架不少,XUtils、Universal-Image-Loader、Volley、Fresco等都可以用来作为第三方框架,这些框架都为我们做了很好的图片资源优化的工作,第一次网络请求图片,内存缓存图片,本地缓存图片,自适应缩放图片加以展示,这些节省了我们的工作量,事实上,我们用这些框架开发我们的应用省去了优化的工作量,也避免了应用因这些元素没处理好而报OOM异常,那么我们今天要来介绍的Picasso和它们又有什么区别呢?下面从官网上的介绍来开始。
Picasso官网,好像需要翻墙才能打开,我截了张图,来看看介绍:
我们可以看到,我们可以按照下面这种写法来使用picasso,十分的简单:
Picasso.with(context).load(“http://i.imgur.com/DvpvklR.png“).into(imageView);
看到这里,我就觉得这是不是太简单啦,这简直是太轻松了吧,我们省去了像Universal-Image-Loader那样的配置环节,不用在Application里初始化,也不用设置一些Builder内容,就这么简单的一句话我们就可以实现加载图片了,简直是将上手程度降到最低了,实际上,它的操作程度正如我们看到的这么简单,让我们慢慢道来。
- Adapter re-use is automatically detected and the previous download canceled.
@Override public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
Picasso.with(context).load(url).into(view);
}
这里介绍的是picasso的回收机制,它可以自动的回收并且取消先前的下载,这就保证了adapter的循环利用性,以及一些不必要的没有展示在前台的一些下载操作。
- Transform images to better fit into layouts and to reduce memory size.
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
我们可以使用这样的方式来改变我们图片的大小,更好的适应我们的屏幕布局并且减少内存占用。
- You can also specify custom transformations for more advanced effects.
public class CropSquareTransformation implements Transformation {
@Override public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
if (result != source) {
source.recycle();
}
return result;
}
@Override public String key() { return "square()"; }
}
我们还可以根据自己的需求,自定义一套适合自己的转变规则,比如说圆角、圆形……
- Picasso supports both download and error placeholders as optional features.
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
A request will be retried three times before the error placeholder is shown.
我们可以像给ImageLoader设置占位图那样给Picasso设置占位图,同时我们还可以给它设置一张加载出错的图片,当然它有前提是请求尝试过3次后仍然失败的,才会加载错误提示图。
- Resources, assets, files, content providers are all supported as image sources.
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);
Picasso还可以加载资源图片,assets图片,文件图片,content provider里的图片,它都可以支持,兼容面还是非常广的。
好了,说了这么多,不如实际来体验一下吧,我创建了一个很简单的工程,在网上copy了一些图片网址,然后用Picasso加载,从加载体验和展示效果上来说,还是很棒的,并且在上下滑动加载回收项的时候,可以有瞬间可以看到是从回收中打开的条目,优化做的不错,下面是工程代码:
public class MainActivity extends AppCompatActivity {
private ListView listview;
private List<String> imgLists;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
context = MainActivity.this;
initDatas();
listview = (ListView) findViewById(R.id.listview);
listview.setAdapter(new MyAdapter());
}
private void initDatas() {
imgLists = new ArrayList<String>();
imgLists.add("http://att.bbs.duowan.com/forum/201403/29/1905260ittk00atvvrog0b.jpg");
imgLists.add("http://pic35.nipic.com/20131117/13761370_113517130000_2.png");
imgLists.add("http://imgsrc.baidu.com/baike/pic/item/964b2e4e2ec80286d0c86a00.jpg");
imgLists.add("http://pic42.nipic.com/20140605/18641501_160421864000_2.jpg");
imgLists.add("http://img2.3lian.com/2014/f2/43/d/83.jpg");
}
public class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return imgLists.size();
}
@Override
public String getItem(int position) {
return imgLists.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_item,null);
holder.imageview = (ImageView)convertView.findViewById(R.id.image);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
String url = getItem(position);
Picasso.with(context).load(url).into(holder.imageview);
return convertView;
}
}
class ViewHolder{
ImageView imageview;
}
}
最终效果图:
大家伙可以动手试试,说不定会颠覆你以前的观点,爱上它呢?
- 希望大家关注我更多的博客,我会不定期更新更多的内容,欢迎大家订阅公众号,我会不定期更新资源,供大家一起学习,一起进步。