实际开发中,很多项目中需要用到圆形图片,例如,项目中个人资料的用户头像。加载图片的框架有很多,我们就简单的说几个,及其他们的优缺点。
首先是Fresco,它的优点是其他几个框架没有的,或者说是其他几个框架的短板。
优点:
1.图片存储在安卓系统的匿名共享内存,而不是虚拟机的堆内存中,图片的中间缓存数据也存放在本地堆内存。所以程序有更多的内存使用,不会因为图片的加载而导致OOM(OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大。),同时也减少垃圾回收器频繁的回收Bitmap导致界面的卡顿,性能更高
2.渐进式加载JPEG图片,支持图片从模糊到清晰的加载
3.图片可以以任意的中心点显示在ImageView中,而不仅仅是图片的中心。
4.JPEG图片改变大小也是在native进行的,不是在虚拟机的堆内存,同样减少OOM。
5.很好的支持GIF图片的显示
缺点:
1.框架较大,影响apk体积
2.使用较繁琐
ImageLoader
比较老的框架,稳定,加载速度适中,缺点在于不能加载Gif图片,使用稍微繁琐,并且缓存机制没有和http的缓存机制很好的结合,完全是子的一套缓存机制。
PIcasso
优点:使用方便,一行代码完成加载图片和显示出来,框架体积小
缺点:不支持GIf图片,并且他可能是想让服务器去处理图片的缩放,他的缓存图片是未缩放的,并且是默认使用ARGB_8888格式缓存图片的,缓存体积大
这就是我们今天的主角 Glide
glide可以说是Picasso的升级版,有picass的优点,并且支持gif图片的加载和显示,图片缓存也会自动的缩放,默认使用RGB-565格式缓存图片,是picasso缓存体积的一半。
今天我们就用glide实现加载圆形图片和
先看一个效果图
首先先加载glide的jia包
compile 'com.github.bumptech.glide:glide:3.7.0'
当然有网络请求,你一定不能忘记加网络权限
<uses-permission android:name="android.permission.INTERNET" />
自定义一个glide的圆形转换类
public class GlideCircleTransform extends BitmapTransformation{
public GlideCircleTransform(Context context) {
super(context);
}
@Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override public String getId() {
return getClass().getName();
}
}
xml文件布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f00"
android:orientation="vertical">
<ImageView
android:id="@+id/ima"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp" />
<ImageView
android:id="@+id/tv"
android:layout_width="60dp"
android:layout_height="60dp"
/>
</LinearLayout>
加载时候就只需要new类就可以
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView ima = (ImageView) findViewById(R.id.ima);
final ImageView tv = (ImageView) findViewById(R.id.tv);
//这是加载圆形图片的
Glide.with(this).load("http://image.tianjimedia.com/uploadImages/2013/235/56Y682R36Y6X.jpg").transform(new GlideCircleTransform(this)).into(ima);
//这是加载正常图片的
Glide.with(this).load("http://pic33.nipic.com/20130916/3420027_192919547000_2.jpg").into(tv);
}
}
写到这里,技术就已经写完了。剩下来的时间就到了博主讲段子的时间了。今天我们开波车。
我们要说的还是我那个朋友,丑康的事。丑康,你别看他丑,但是有大智慧,也有大毅力的一个人,为什么这么说,因为他喝饮料都可以把饮料钱从老板手里拿回来,他每次去小卖铺买冰红茶,买了喝一半,然后尿一半回去,然后回店里告诉老板,你卖的饮料过期了,都变味了,你不信你自己喝下,老板一喝,不对劲,只能给他退钱,自从他喝了一款叫做营养快线的饮料后,他的身体一天不如一天了。
可能你会说,为什么要一直突出丑康的丑,那是因为