compile 'com.facebook.fresco:fresco:0.14.1' compile 'com.facebook.fresco:animated-webp:0.14.1' compile 'com.facebook.fresco:webpsupport:0.14.1' compile 'com.facebook.fresco:animated-gif:0.14.1'
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private SimpleDraweeView image; private Uri uri = Uri.parse("http://img.zcool.cn/community/01dc845668e8a032f875a5289bc703.jpg"); private GenericDraweeHierarchyBuilder builder; private RoundingParams parames; private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = findViewById(R.id.text); image = findViewById(R.id.image); findViewById(R.id.progress).setOnClickListener(this); findViewById(R.id.center).setOnClickListener(this); findViewById(R.id.center_crop).setOnClickListener(this); findViewById(R.id.focus_crop).setOnClickListener(this); findViewById(R.id.center_inside).setOnClickListener(this); findViewById(R.id.fit_center).setOnClickListener(this); findViewById(R.id.fit_start).setOnClickListener(this); findViewById(R.id.fit_end).setOnClickListener(this); findViewById(R.id.fit_xy).setOnClickListener(this); findViewById(R.id.none).setOnClickListener(this); findViewById(R.id.circle).setOnClickListener(this); findViewById(R.id.round).setOnClickListener(this); findViewById(R.id.gradually).setOnClickListener(this); findViewById(R.id.high_and_low).setOnClickListener(this); findViewById(R.id.thumbnail).setOnClickListener(this); findViewById(R.id.local_picture_multiplexing).setOnClickListener(this); findViewById(R.id.listener).setOnClickListener(this); findViewById(R.id.modify_resource_size).setOnClickListener(this); findViewById(R.id.modify).setOnClickListener(this); findViewById(R.id.bt_fresco_gif).setOnClickListener(this); findViewById(R.id.bt_fresco_resize).setOnClickListener(this); findViewById(R.id.dynamic_diaplay).setOnClickListener(this); //创建Builder对象,一般创建出参数对象 builder = new GenericDraweeHierarchyBuilder(getResources()); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.bt_fresco_gif: //请求GIF动画,采用MVC的设计模式(注意加载GIF动画还要添加依赖) /* 支持 GIF 动图,需要添加:compile 'com.facebook.fresco:animated-gif:0.14.1' */ //GIF动画网址,加载需要一段时间 Uri uri1 = Uri.parse("http://s1.dwstatic.com/group1/M00/6E/E4/801cd8b56959a9bd72197b5b6a3757b4.gif"); DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(uri1)//设置GIF网址 .setAutoPlayAnimations(false)//是否自动播放动画,false为不播放 .setOldController(image.getController())//内存优化 .build(); image.setController(controller); // 动画停止 //拿到动画对象 Animatable animatableStop = image.getController().getAnimatable(); //进行非空及是否动画在播放判断 if (animatableStop != null && animatableStop.isRunning()) { //动画在播放,停止动画播放 animatableStop.stop(); } // 动画开始 //拿到动画对象 Animatable animatableStart = image.getController().getAnimatable(); //进行非空及是否动画在播放判断 if (animatableStart != null && !animatableStart.isRunning()) { //动画停止播放,播放动画 animatableStart.start(); } break; case R.id.bt_fresco_resize: /* RotationOptions rotationOptions = RotationOptions.forceRotation(360); ImageRequest build = ImageRequestBuilder.newBuilderWithSource(getUriForFresco(this, R.mipmap.ic_launcher)) .setRotationOptions(rotationOptions) .build(); PipelineDraweeController c = (PipelineDraweeController) Fresco.newDraweeControllerBuilder() .setImageRequest(build) .build(); image.setController(c);*/ break; case R.id.progress: //创建参数对象,设置其样式为进度条 GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build(); //将参数对象设置给图片控件 image.setHierarchy(hierarchy); //控件加载图片,参数:网络图片的网址. image.setImageURI(uri); break; case R.id.center: // 样式设置,使图片只显示中间的部分 GenericDraweeHierarchy CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build(); imageDisplay(CENTER); break; case R.id.center_crop: GenericDraweeHierarchy CENTER_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP).build(); imageDisplay(CENTER_CROP); break; case R.id.focus_crop: GenericDraweeHierarchy FOCUS_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP).build(); imageDisplay(FOCUS_CROP); break; case R.id.center_inside: GenericDraweeHierarchy CENTER_INSIDE = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE).build(); imageDisplay(CENTER_INSIDE); break; case R.id.fit_center: GenericDraweeHierarchy FIT_CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER).build(); imageDisplay(FIT_CENTER); break; case R.id.fit_start: GenericDraweeHierarchy FIT_START = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_START).build(); imageDisplay(FIT_START); break; case R.id.fit_end: GenericDraweeHierarchy FIT_END = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_END).build(); imageDisplay(FIT_END); break; case R.id.fit_xy: GenericDraweeHierarchy FIT_XY = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_XY).build(); imageDisplay(FIT_XY); break; case R.id.none: GenericDraweeHierarchy NONE = builder.setActualImageScaleType(null).build(); imageDisplay(NONE); break; case R.id.circle: // 设置圆形图片 // 设置形状对象,形状为圆形 parames = RoundingParams.asCircle(); //创建设置参数,设置一个形状,把形状对象塞入 GenericDraweeHierarchy roundness = builder.setRoundingParams(parames).build(); //将参数对象设置给图片控件 image.setHierarchy(roundness); //控件加载图片 image.setImageURI(uri); break; case R.id.round: // 设置圆角图片 // 设置形状对象,形状为圆角 parames = RoundingParams.fromCornersRadius(50f); //创建设置参数,设置一个形状,把形状对象塞入 GenericDraweeHierarchy roundness1 = builder.setRoundingParams(parames).build(); //将参数对象设置给图片控件 image.setHierarchy(roundness1); //控件加载图片 image.setImageURI(uri); break; case R.id.gradually: // 加载质量配置,为了实现节省CPU,随着图片下载的进行,下载完的扫描序列如下: 1, 4, 5, 10 /* 首次调用getNextScanNumberToDecode返回为2, 因为初始时,解码的扫描数为0。 那么1将不会解码,下载完成4个扫描时,解码一次。下个解码为扫描数为6(5不会解码,10才会解码)*/ ProgressiveJpegConfig jpegConfig = new ProgressiveJpegConfig() { @Override public int getNextScanNumberToDecode(int scanNumber) { return scanNumber + 2; } @Override public QualityInfo getQualityInfo(int scanNumber) { boolean isGoodEnough = (scanNumber >= 5); return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false); } }; //上面的和下面一行是固定代码.使用使复制粘贴即可 ImagePipelineConfig.newBuilder(this).setProgressiveJpegConfig(jpegConfig).build(); // 创建 ImageRequest 对象. ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)//设置URL .setProgressiveRenderingEnabled(true)//打开渐进 渲染 .build(); DraweeController draweeController = Fresco.newDraweeControllerBuilder() //必须要设置ImageRequest对象,里面包含了图片的网址. .setImageRequest(request) //开启用户点击重新加载图片的功能 .setTapToRetryEnabled(true) //会复用以前的对象,可以节省内存. .setOldController(image.getController()) .build(); // 1设置加载的控制 image.setController(draweeController); break; case R.id.high_and_low: // 先显示低分辨率的图,然后是高分辨率的图,MVC的设计模式 // 同一个图片,不同分辨率的两个URL地址 Uri lowUri = Uri.parse("http://img1.gamedog.cn/2012/03/11/19-120311133617-50.jpg"); // 控制加载图片 DraweeController controller1 = Fresco.newDraweeControllerBuilder() //一开始加载一个低分辨率的URL .setLowResImageRequest(ImageRequest.fromUri(lowUri)) //然后加载一个高分辨率的URL,你真正要加载的图片 .setImageRequest(ImageRequest.fromUri(uri)) .build(); // 加载图片 image.setController(controller1); break; case R.id.thumbnail: // 本地缩略图预览 // 图片地址,参数1.File对象, 从手机手机SD卡里加载一张图片 Uri local_uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/shuaige.jpg")); // 加载图片的请求 ImageRequest request1 = ImageRequestBuilder.newBuilderWithSource(local_uri) //开启缩略图预览模式 .setLocalThumbnailPreviewsEnabled(true) .build(); // 控制图片的加载 DraweeController preview = Fresco.newDraweeControllerBuilder() .setImageRequest(request1) .build(); // 加载图片 image.setController(preview); break; case R.id.local_picture_multiplexing: //本地图片的复用 //在请求之前,还会去内存中请求一次图片,没有才会先去本地,最后去网络uri //本地准备复用图片的uri 如果本地这个图片不存在,会自动去加载下一个uri // 本地图片的地址 Uri uri2 = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/shuaige.jpg")); //图片的网址uri //创建ImageRequest对象,将其放入ImageRequest[]数组中. ImageRequest request2 = ImageRequest.fromUri(uri2); ImageRequest request3 = ImageRequest.fromUri(uri); ImageRequest[] requests = {request2, request3}; // 控制加载图片 DraweeController reuse = Fresco.newDraweeControllerBuilder() //设置加载图片的顺序.参数ImageRequest[]数组 .setFirstAvailableImageRequests(requests) .setOldController(image.getController()) .build(); // 加载图片 image.setController(reuse); break; case R.id.listener: // 加载质量配置,为了实现节省CPU,随着图片下载的进行,下载完的扫描序列如下: 1, 4, 5, 10 /* 首次调用getNextScanNumberToDecode返回为2, 因为初始时,解码的扫描数为0。 那么1将不会解码,下载完成4个扫描时,解码一次。下个解码为扫描数为6(5不会解码,10才会解码)*/ ProgressiveJpegConfig jpegConfig1 = new ProgressiveJpegConfig() { @Override public int getNextScanNumberToDecode(int scanNumber) { return scanNumber + 2; } @Override public QualityInfo getQualityInfo(int scanNumber) { boolean isGoodEnough = (scanNumber >= 5); return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false); } }; //上面的和下面一行是固定代码.使用使复制粘贴即可 ImagePipelineConfig.newBuilder(this).setProgressiveJpegConfig(jpegConfig1).build(); // 图片请求, ImageRequest request4 = ImageRequestBuilder.newBuilderWithSource(uri)//指定加载图片地址 .setProgressiveRenderingEnabled(true)打开渐进 渲染 .build(); ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() { // 加载图片完毕回调 @SuppressLint("SetTextI18n") @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { super.onFinalImageSet(id, imageInfo, animatable); //图片信息对象非空判断 if (imageInfo == null) { return; } // 获取图片的质量信息 QualityInfo qualityInfo = imageInfo.getQualityInfo(); text.setText("Final image received! " + "\nSize: " + imageInfo.getWidth() //图片宽 + "x" + imageInfo.getHeight() //图片高 + "\nQuality level: " + qualityInfo.getQuality() //图片等级 + "\ngood enough: " + qualityInfo.isOfGoodEnoughQuality() //图片是否效果完全显示 + "\nfull quality: " + qualityInfo.isOfFullQuality()); //图片是否完全显示 } // 渐进式加载图片回调(只有启用来图片的渐进式,方有效) @Override public void onIntermediateImageSet(String id, ImageInfo imageInfo) { super.onIntermediateImageSet(id, imageInfo); text.setText("IntermediateImageSet image receiced"); } // 加载图片失败回调 @Override public void onFailure(String id, Throwable throwable) { super.onFailure(id, throwable); //这里的id参数就是图片加载失败的打印信息 text.setText("Error loading" + id); } }; // 图片加载的控制 DraweeController controller5 = Fresco.newDraweeControllerBuilder() .setOldController(image.getController()) .setImageRequest(request4) //设置监听器监听图片的加载 .setControllerListener(controllerListener) .build(); // 加载图片 image.setController(controller5); break; case R.id.modify_resource_size: //图片的请求 ImageRequest request5 = ImageRequestBuilder.newBuilderWithSource(uri) //重新设置这张图片的宽高.以便解决内存 .setResizeOptions(new ResizeOptions(50, 50)) .build(); // 控制图片的加载 PipelineDraweeController controller2 = (PipelineDraweeController) Fresco.newDraweeControllerBuilder() .setOldController(image.getController()) .setImageRequest(request5) .build(); // 加载图片 image.setController(controller2); break; case R.id.modify: // 修改图片 Postprocessor postProcessor = new BasePostprocessor() { //重新Postprocessor名称. @Override public String getName() { return "postProcessor"; } //具体的进行绘制,bitmap就是下载过来的图片,绘制红色点状网络 @Override public void process(Bitmap bitmap) { for (int x = 0; x < bitmap.getWidth(); x += 2) { for (int y = 0; y < bitmap.getHeight(); y += 2) { //给图片点设置颜色,参数X轴,Y轴,颜色 bitmap.setPixel(x, y, Color.RED); } } } }; // 创建图片请求 ImageRequest request6 = ImageRequestBuilder.newBuilderWithSource(uri) //对加载进行处理.参数就是处理的模型Postprocessor对象. .setPostprocessor(postProcessor) .build(); // 控制加载 PipelineDraweeController controller3 = (PipelineDraweeController) Fresco.newDraweeControllerBuilder() .setOldController(image.getController()) .setImageRequest(request6) .build(); // 加载图片 image.setController(controller3); break; case R.id.dynamic_diaplay: startActivity(new Intent(MainActivity.this,Show.class)); //Toast.makeText(MainActivity.this,"---",Toast.LENGTH_LONG).show(); break; } } private void imageDisplay(GenericDraweeHierarchy hierarchy) { // 加载图片 image.setHierarchy(hierarchy); image.setImageURI(uri); } }