| | |
| | | import android.graphics.BitmapShader; |
| | | import android.graphics.Canvas; |
| | | import android.graphics.Paint; |
| | | import android.support.annotation.NonNull; |
| | | |
| | | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; |
| | | import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; |
| | | |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.security.MessageDigest; |
| | | |
| | | /** |
| | | * glide 加载圆形图片 |
| | | * |
| | | * |
| | | * @author weikou2015 |
| | | * |
| | | */ |
| | | 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 final String ID = GlideCircleTransform.class.getClass().getName(); |
| | | private static byte[] ID_BYTES = null; |
| | | |
| | | private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { |
| | | if (source == null) |
| | | return null; |
| | | public GlideCircleTransform(Context context) { |
| | | try { |
| | | ID_BYTES = ID.getBytes(STRING_CHARSET_NAME); |
| | | } catch (UnsupportedEncodingException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | int size = Math.min(source.getWidth(), source.getHeight()); |
| | | int x = (source.getWidth() - size) / 2; |
| | | int y = (source.getHeight() - size) / 2; |
| | | @Override |
| | | protected Bitmap transform(BitmapPool pool, Bitmap toTransform, |
| | | int outWidth, int outHeight) { |
| | | return circleCrop(pool, toTransform); |
| | | } |
| | | |
| | | // TODO this could be acquired from the pool too |
| | | Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); |
| | | private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { |
| | | if (source == null) |
| | | return null; |
| | | |
| | | Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); |
| | | if (result == null) { |
| | | result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); |
| | | } |
| | | int size = Math.min(source.getWidth(), source.getHeight()); |
| | | int x = (source.getWidth() - size) / 2; |
| | | int y = (source.getHeight() - size) / 2; |
| | | |
| | | 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; |
| | | } |
| | | // TODO this could be acquired from the pool too |
| | | Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); |
| | | |
| | | @Override |
| | | public String getId() { |
| | | return getClass().getName(); |
| | | } |
| | | 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 int hashCode() { |
| | | return ID.hashCode(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { |
| | | messageDigest.update(ID_BYTES); |
| | | } |
| | | } |