1.导包 https://pan.baidu.com/s/1qXO05nm 密码:30ud
添加 依赖
compile 'com.github.bumptech.glide:glide:4.2.0'
添加权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
2.主函数
package comqq.example.hasee.myapplication; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.Priority; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; import java.io.File; public class MainActivity extends AppCompatActivity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv= (ImageView) findViewById(R.id.iv); } public void cc(View view) { switch (view.getId()) { case R.id.but1: //普通加载 File file1 = new File(Environment.getExternalStorageDirectory(), "02.jpg"); Glide.with(this).load(file1).listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object o, Target<Drawable> target, boolean b) { Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onResourceReady(Drawable drawable, Object o, Target<Drawable> target, DataSource dataSource, boolean b) { Toast.makeText(MainActivity.this, "加载成功", Toast.LENGTH_SHORT).show(); return false; } }).into(iv); break; case R.id.but2: //加载gif File file2 = new File(Environment.getExternalStorageDirectory(), "aa.gif"); Glide.with(this).asGif().load(file2).into(iv); break; case R.id.but3: //加载原图的缩略图 //先加载为原图的十分之一,后再加载原图 Glide.with(this).load("http://www.hinews.cn/pic/0/10/24/62/10246261_856361.jpg").thumbnail(0.1f).into(iv); break; case R.id.but4: //先加载第一张图片作为缩略图,在加载最终要显示的图片 //thumbnail中加载的是缩略图 Glide.with(this).load("http://img2.3lian.com/2014/f3/51/d/2.jpg") .thumbnail(Glide.with(this).load("http://img1.gtimg.com/0/1/168/16805_1200x1000_0.jpg")).into(iv); break; case R.id.but5: //加载设置不缓存 Glide.with(this) .load("http://img.mp.itc.cn/upload/20161104/d5737b849b6442ea9f594ddc3cbbc23a_th.jpeg") .apply(new RequestOptions().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)) .into(iv); break; case R.id.but6: //加载设置优先级 Glide.with(this) .load("http://5.26923.com/download/pic/000/330/4a9bfbb14275471e5ec956ad416b6194.jpg") .apply(new RequestOptions().priority(Priority.LOW)) .into(iv); break; case R.id.but7: //加载回调后的图片 //上面这段代码不要写成匿名内部类的机制,原因就是java的自动垃圾回收机制可能在图片还没有加载好的时候就已经把你的Target回收了 //注意.with()里面的参数,Glide的请求是和传进去的Context共存亡的,如果传一个Activity进去,当Activity GG过后,你的请求也就GG了,但是如果这样传:.with(context.getApplicationContext() ).当你的Activity GG过后,请求还是会继续,回调还是会继续。 //强制Glide返回一个Bitmap SimpleTarget<Bitmap> sim = new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> transition) { iv.setImageBitmap(bitmap); } }; Glide.with(this).asBitmap().load("http://pic1.win4000.com/wallpaper/8/55f91ad3a23ea.jpg").into(sim); break; case R.id.but8: //加载回调后的图片设置尺寸 //强制Glide返回一个Bitmap SimpleTarget<Bitmap> target = new SimpleTarget<Bitmap>(300, 300) { @Override public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) { iv.setImageBitmap(resource); } }; Glide.with(this).asBitmap() .load("http://www.hinews.cn/pic/0/14/00/69/14006911_715505.jpg") .into(target); break; case R.id.but9: //加载图片圆角转换 Glide.with(this) .load("http://p4.so.qhmsg.com/t0199c5431414d2ea29.jpg") .apply(new RequestOptions().transform(new GlideRoundTransform(this))) .into(iv); break; case R.id.but10: //加载图片圆角转换2 Glide.with(this) .load("http://p2.cri.cn/M00/1C/C0/CqgNOlm4oreAHkbcAAAAAAAAAAA69.3200x2000.jpeg") .apply( new RequestOptions() .override(300) .transform(new RoundedCorners(20)) ) .into(iv); break; case R.id.but11: //加载图片ID占位图 RequestOptions options = new RequestOptions() .placeholder(R.mipmap.ic_launcher)//加载中 .error(R.mipmap.ee)//加载错误 .fallback(R.mipmap.ic_launcher) .diskCacheStrategy(DiskCacheStrategy.NONE); Glide.with(this) .load("http://p2.cri.cn/M00/1C/C0/CqgNOlm4oreAHkbcAAAAAAAAAAA69.3200x2000.jpeg") .apply(options) .into(iv); break; case R.id.but12: //加载图片Drawable占位图 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); Drawable drawable = new BitmapDrawable(getResources(), bitmap); RequestOptions op = new RequestOptions().placeholder(drawable); Glide.with(this) .load("http://p0.so.qhmsg.com/t010b9ba7c1e568dd3f66.jpg") .apply(op) .into(iv); break; case R.id.but13: //当加载图片传入null 会有图片显示 RequestOptions op2 = new RequestOptions() .fallback(R.mipmap.ic_launcher) .diskCacheStrategy(DiskCacheStrategy.NONE); Glide.with(this) .load(null) .apply(op2) .into(iv); break; case R.id.but14: //加载图片后修改宽高 RequestOptions op3 = new RequestOptions().override(400, 400).fitCenter(); Glide.with(this).load("http://img3.a0bi.com/upload/ttq/20160621/1466508726953.jpg") .apply(op3) .into(iv); break; case R.id.but15: //加载图片centerCrop RequestOptions op4 = new RequestOptions() .centerCrop(); Glide.with(this) .load("http://img2.3lian.com/2014/f3/51/d/2.jpg") .apply(op4) .into(iv); break; case R.id.but16: //加载图片fitCenter Glide.with(this) .load("http://www.285868.com/uploadfile/2016/1027/20161027102235543.jpg") .apply(new RequestOptions().fitCenter()) .into(iv); //加载图片centerInside 就是把new RequestOptions().后面换成centerInside就行 //11加载图片circleCrop 就是把new RequestOptions().后面换成circleCrop就行 break; case R.id.but17: //加载动态图的第一帧 Glide.with(this).asBitmap(). load("http://uploads.rayli.com.cn/2016/0823/1471943453795.gif").into(iv); break; case R.id.but18: //加载动态图成功 //GIF加载,URL指向的资源必须是gif,如果是普通图片则不显示。 //相反,如果指向正确但没有执行asGif方法,则只是作为普通图片展示 Glide.with(this).asGif().load("http://uploads.rayli.com.cn/2016/0823/1471943453795.gif").into(iv); break; case R.id.but19: //加载本地视频缩略图 Glide.with(this).load(Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"v.f40.mp4"))) .into(iv); break; } } }
3.有一个实现圆的类
package comqq.example.hasee.myapplication;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import java.security.MessageDigest;
/**
*实现圆角效果.
*/
public class GlideRoundTransform extends BitmapTransformation {
private float radius = 0f;
public GlideRoundTransform(Context context) {
this(context, 20);
}
public GlideRoundTransform(Context context, int dp) {
super(context);
//density,屏幕密度.1.5,1,0.75
this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
//Bitmap.Config.ARGB_8888,图片质量.
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
//REPEAT,MIRROR,CLAMP{重复,镜像,拉伸}
//设置着色器
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
//设置抗锯齿.
paint.setAntiAlias(true);
//矩阵,(float left, float top, float right, float bottom)
//矩形的左边的x坐标,矩形的顶部的Y坐标,对右侧的矩形的x坐标,矩形的底部的Y坐标
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
//画指定的圆矩形。
//drawRoundRect(RectF rect, float rx, float ry, @NonNull Paint paint)
//矩阵,圆角,椭圆的x半径,y半径.画笔,
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
}
}
4.主布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="comqq.example.hasee.myapplication.MainActivity"
android:orientation="horizontal">
<ScrollView
android:layout_width="wrap_content"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<Button
android:id="@+id/but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1.普通加载带提示"
android:onClick="cc"
/>
<Button
android:id="@+id/but2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2.加载gif"
android:onClick="cc"/>
<Button
android:id="@+id/but3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3.加载原图的缩略图"
android:onClick="cc"/>
<Button
android:id="@+id/but4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4.缩略图"
android:onClick="cc"/>
<Button
android:id="@+id/but5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5.加载设置不缓存"
android:onClick="cc"/>
<Button
android:id="@+id/but6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="6.加载设置优先级"
android:onClick="cc"/>
<Button
android:id="@+id/but7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7.加载回调后的图片"
android:onClick="cc"/>
<Button
android:id="@+id/but8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8.加载回调后的图片设置尺寸"
android:onClick="cc"/>
<Button
android:id="@+id/but9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="9.加载图片圆角转换"
android:onClick="cc"/>
<Button
android:id="@+id/but10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="10.加载图片圆角转换2"
android:onClick="cc"/>
<Button
android:id="@+id/but11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11.加载图片ID占位图"
android:onClick="cc"/>
<Button
android:id="@+id/but12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="12.加载图片Drawable占位图"
android:onClick="cc"/>
<Button
android:id="@+id/but13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="13.当加载图片传入null 会有图片显示"
android:onClick="cc"/>
<Button
android:id="@+id/but14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="14.加载图片后修改宽高"
android:onClick="cc"/>
<Button
android:id="@+id/but15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="15.加载图片centerCrop"
android:onClick="cc"/>
<Button
android:id="@+id/but16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="16.加载图片fitCenter或..."
android:onClick="cc"/>
<Button
android:id="@+id/but17"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="17.加载动态图的第一帧"
android:onClick="cc"/>
<Button
android:id="@+id/but18"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="18.加载动态图成功"
android:onClick="cc"/>
<Button
android:id="@+id/but19"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="19.加载本地视频缩略图"
android:onClick="cc"/>
</LinearLayout>
</ScrollView>
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
5.这下面是额外的效果
private void showDialog() {
DialogUtil.showListDialog(this, "图片的形状的变换!", new String[]{
"0,将图像剪切成圆",
"1,将图像剪切成三角形",
"2,将图像剪切成多角形",
"3,将图像剪切成曲线形",
"4,将图像剪切成圆角形",
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
Glide.with(BecomeActivity.this)
.load(IMG_URL_0)
.apply(RequestOptions.bitmapTransform(new CropCircleTransformation()))
.into(iv);
break;
case 1:
MultiTransformation<Bitmap> transformation
= new MultiTransformation<>(new CenterCrop(), new MaskTransformation(R.mipmap.mask_trangle));
Glide.with(BecomeActivity.this)
.load(IMG_URL_1)
.apply(bitmapTransform(transformation))
.into(iv);
break;
case 2:
Glide.with(BecomeActivity.this)
.load(IMG_URL_2)
.apply(bitmapTransform(new MultiTransformation<>(new CenterCrop(), new MaskTransformation(R.mipmap.mask_starfish))))
.into(iv);
break;
case 3:
Glide.with(BecomeActivity.this)
.load(IMG_URL_3)
.apply(bitmapTransform(new MultiTransformation<>(new CenterCrop(), new MaskTransformation(R.drawable.mask_chat_right))))
.into(iv);
break;
case 4:
Glide.with(BecomeActivity.this)
.load(IMG_URL_4)
.apply(bitmapTransform(new RoundedCornersTransformation(45, 0,
RoundedCornersTransformation.CornerType.BOTTOM)))
.into(iv);
break;
}
}
});
}