package com.yelong.medicalscience.widgets;
import android.annotation.SuppressLint;
import android.content.Context;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PaintFlagsDrawFilter;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.util.AttributeSet;import android.widget.ImageView;public class ShapeImageView extends ImageView {
public static final String TAG = "ShapeImageView";public static final int RECTANGLE = 0;
public static final int ROUND_RECTANGLE = 1; public static final int CIRCLE = 2;/** 圆角矩形的四角弧度,单位是像素 */
private static final int RADIUS_X = 10; private static final int RADIUS_Y = 10;private Bitmap mShapeBmp = null;
private BitmapDrawable mBmpDrawable = null; private int mShape = ROUND_RECTANGLE; private int mRadiusX = RADIUS_X; private int mRadiusY = RADIUS_Y;private int mWidth;
private int mHeight;// paint的遮罩层,canvas在绘制原图和下一张图时,两者的交互绘制模式(相交、合并、异或等)
private PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); // Paint的标识绘制过滤器,用于设置图片绘制的抗锯齿效果 private PaintFlagsDrawFilter pdf = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);public ShapeImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); }public ShapeImageView(Context context, AttributeSet attrs) {
super(context, attrs); }public ShapeImageView(Context context) {
super(context); }public int getShape() {
return mShape; }public void setShape(int mShape) {
this.mShape = mShape; }public int getRadiusX() {
if (mShape == ROUND_RECTANGLE) return mRadiusX; else return 0; }public int getRadiusY() {
if (mShape == ROUND_RECTANGLE) return mRadiusY; else return 0; }/**
* 设置圆角矩形的弧度(当shape=ROUND_TANGLE才有效) * * @param mRadiusX */ public void setRadius(int radiusX, int radiusY) { if (mShape == ROUND_RECTANGLE) { this.mRadiusX = radiusX; this.mRadiusY = radiusY; } }/**
* 生成几何蒙版bitmap,即创建图片想要的几何形状(圆角、圆形等)的底板,用于与原图相交绘制 * * @param w * @param h * @return */ private Bitmap getShapeBitmap(int width, int height, Bitmap bitmapSrc, int shape) { float widthScaleRatio, heightScaleRatio;// 缩放比例,用于缩放圆角,使显示的圆角总是XY半径相等 int bmpSrcWidth = bitmapSrc.getWidth(); int bmpSrcHeight = bitmapSrc.getHeight(); Bitmap bmpDst = Bitmap.createBitmap(bmpSrcWidth, bmpSrcHeight, Config.ARGB_8888);// 创建蒙板bitmap Canvas canvas = new Canvas(bmpDst);// 创建蒙板画布 Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);// 创建透明抗锯齿画笔 p.setColor(Color.parseColor("#ffffffff"));widthScaleRatio = (1.0f * bmpSrcWidth) / (1.0f * width);// 原图与目标bounds的缩放比例
heightScaleRatio = (1.0f * bmpSrcHeight) / (1.0f * height); canvas.setDrawFilter(pdf);// 根据shape值绘制不同的几何蒙版
switch (shape) { case ROUND_RECTANGLE: canvas.drawRoundRect(new RectF(0, 0, bmpSrcWidth, bmpSrcHeight), mRadiusX * widthScaleRatio, mRadiusY * heightScaleRatio, p);// 绘制蒙版bitmap(PS:圆角的半径的单位是像素) break; case CIRCLE: canvas.drawOval(new RectF(0, 0, bmpSrcWidth, bmpSrcHeight), p);// 绘制蒙版bitmap(PS:圆角的半径的单位是像素) break; default: break; }p.setXfermode(xfermode);
canvas.drawBitmap(bitmapSrc, null, new RectF(0, 0, bmpSrcWidth, bmpSrcHeight), p);// 绘制原图并相交得出最终圆角图片 p.setXfermode(null);return bmpDst;
}@SuppressLint("DrawAllocation")
@SuppressWarnings("deprecation") @Override protected void onDraw(Canvas canvas) {if (getDrawable() instanceof BitmapDrawable && getDrawable() != null) {
mBmpDrawable = (BitmapDrawable) getDrawable(); if (!mBmpDrawable.getBitmap().equals(mShapeBmp)) { mWidth = getWidth(); mHeight = getHeight(); mShapeBmp = getShapeBitmap(mWidth, mHeight, mBmpDrawable.getBitmap(), mShape); BitmapDrawable drawable = new BitmapDrawable(mShapeBmp); setImageDrawable(drawable); return; }}
super.onDraw(canvas);
}}