Universal-Image-Loader源码阅读(30)-CircleBitmapDisplayer

原创 2016年08月29日 17:07:39

展示圆形图片。把原始图片剪切成圆形图片进行展示。

就是把图片转变成原型图片画在展示器中(ImageAware)。

源码:

/**
 * Can display bitmap cropped by a circle. This implementation works only with ImageViews wrapped
 * in ImageViewAware.
 * <br />
 * If this implementation doesn't meet your needs then consider
 * <a href="https://github.com/vinc3m1/RoundedImageView">RoundedImageView</a> or
 * <a href="https://github.com/Pkmmte/CircularImageView">CircularImageView</a> projects for usage.
 *
 * @author Qualtagh, Sergey Tarasevich (nostra13[at]gmail[dot]com)
 * @since 1.9.5
 */
public class CircleBitmapDisplayer implements BitmapDisplayer {

	protected final Integer strokeColor;//边线颜色
	protected final float strokeWidth;//边线宽度

	public CircleBitmapDisplayer() {
		this(null);
	}

	public CircleBitmapDisplayer(Integer strokeColor) {
		this(strokeColor, 0);
	}

	public CircleBitmapDisplayer(Integer strokeColor, float strokeWidth) {
		this.strokeColor = strokeColor;
		this.strokeWidth = strokeWidth;
	}

	@Override
	public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
		if (!(imageAware instanceof ImageViewAware)) {
			throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
		}

		imageAware.setImageDrawable(new CircleDrawable(bitmap, strokeColor, strokeWidth));
	}

	public static class CircleDrawable extends Drawable {//圆形图片

		protected float radius;//整个图片半径

		protected final RectF mRect = new RectF();
		protected final RectF mBitmapRect;
		protected final BitmapShader bitmapShader;
		protected final Paint paint;//画图片
		protected final Paint strokePaint;//画边线
		protected final float strokeWidth;
		protected float strokeRadius;//不包括边框在内的图片半径

		public CircleDrawable(Bitmap bitmap, Integer strokeColor, float strokeWidth) {
			radius = Math.min(bitmap.getWidth(), bitmap.getHeight()) / 2;

			bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
			mBitmapRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());

			paint = new Paint();
			paint.setAntiAlias(true);
			paint.setShader(bitmapShader);
			paint.setFilterBitmap(true);
			paint.setDither(true);

			if (strokeColor == null) {
				strokePaint = null;
			} else {
				strokePaint = new Paint();
				strokePaint.setStyle(Paint.Style.STROKE);
				strokePaint.setColor(strokeColor);
				strokePaint.setStrokeWidth(strokeWidth);
				strokePaint.setAntiAlias(true);
			}
			this.strokeWidth = strokeWidth;
			strokeRadius = radius - strokeWidth / 2;
		}

		@Override
		protected void onBoundsChange(Rect bounds) {
			super.onBoundsChange(bounds);
			mRect.set(0, 0, bounds.width(), bounds.height());
			radius = Math.min(bounds.width(), bounds.height()) / 2;
			strokeRadius = radius - strokeWidth / 2;

			// Resize the original bitmap to fit the new bound
			Matrix shaderMatrix = new Matrix();
			shaderMatrix.setRectToRect(mBitmapRect, mRect, Matrix.ScaleToFit.FILL);
			bitmapShader.setLocalMatrix(shaderMatrix);
		}

		@Override
		public void draw(Canvas canvas) {
			canvas.drawCircle(radius, radius, radius, paint);//画图
			if (strokePaint != null) {//画边线
				canvas.drawCircle(radius, radius, strokeRadius, strokePaint);
			}
		}

		@Override
		public int getOpacity() {
			return PixelFormat.TRANSLUCENT;
		}

		@Override
		public void setAlpha(int alpha) {
			paint.setAlpha(alpha);
		}

		@Override
		public void setColorFilter(ColorFilter cf) {
			paint.setColorFilter(cf);
		}
	}
}


【Android框架】Android-universal-image-loader源码阅读(一)

图片加载是个非常常见的APP功能,而如今框架横行,在图片加载方面出现了很多图片加载框架:Android-universal-image-loader,pacasso,Fresco,Glide等等图片加...

Android Universal Image Loader源码详解

  • 2016年10月26日 11:51
  • 834KB
  • 下载

universal-image-loader-1.9.2.jar源码

  • 2015年02月04日 11:51
  • 3.93MB
  • 下载

Universal-Image-Loader的图片加载流程源码分析

概述Universal-Image-Loader是经典的图片加载框架,虽然现在该项目不再维护,但对于初学者依旧是值得学习的开源项目之一,本文就该框架的加载图片流程做简要梳理,希望读者有所收获。 该文...

Android-Universal-Image-Loader 源码解读

Universal-Image-Loader是一个强大而又灵活的用于加载、缓存、显示图片的Android库。它提供了大量的配置选项,使用起来非常方便。 基本概念基本使用 首次配置 在第一次使用Im...

Universal-Image-Loader系列2-源码分析

1. 怎么实现大图片的下载,防止OOM前面分析volley,我们知道volley并不适合大文件的下载,因为volley把输入流都写入了byte[]内存,然后写入硬盘缓存,所以容易OOM。 看UIL怎...

Universal-Image-loader 部分源码讲解 及 如何 配合阿里云 实现图片缓存。

Universal-Image-loader 部分源码讲解 及 如何 配合阿里云 实现图片缓存 ImagerLoader 相关使用及使用 我就不再啰嗦了 ,有需求的同学请直接飞过去http://b...

Android图片异步加载框架Universal Image Loader的源码分析

项目地址:https://github.com/nostra13/android-universal-image-loader 1. 功能介绍 1.1 Android Universal Im...
  • pcaxb
  • pcaxb
  • 2015年07月07日 00:34
  • 1110

Android-Universal-Image-Loader(UIL)源码解析(一)

Android-Universal-Image-Loader(UIL) 是android端开源的异步图片下载、缓存库,UIL旨在提供一个强大的、灵活的和高度可定制的图像加载、缓存和显示工具。它提供了...

Android-Universal-Image-Loader(UIL)源码解析(二)

当应用打算从网络请求一张图片时,我们期待程序首先从内存中去获取,如果内存中没有那就从存储设备中去获取,如果存储设备中也没有,那就从网络下载这张图片。所以本节我们学习如何在内存中缓存图片。UIL内存缓存...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Universal-Image-Loader源码阅读(30)-CircleBitmapDisplayer
举报原因:
原因补充:

(最多只允许输入30个字)