直接代码
工具方法
public static Bitmap drawable2Bitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { BitmapDrawable bd = (BitmapDrawable) drawable; return bd.getBitmap(); } int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); drawable.draw(canvas); return bitmap; }自定义imageview
import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.Shader; import android.util.AttributeSet; import android.widget.ImageView; /** * @author meixi * @Emial [email protected] * @date 2018/6/27 0026 17:12 */ @SuppressLint("AppCompatCustomView") public class BitmapShaderCircularView extends ImageView { private Paint paint; private int radius; //圆形头像的半径 private float mScale; private int pathWidth;//绘制轨迹线条宽度 private int shadeColor;//遮罩颜色,argb public BitmapShaderCircularView(Context context) { super(context); } public BitmapShaderCircularView(Context context, AttributeSet attrs) { super(context, attrs); } public BitmapShaderCircularView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //首先在view调用测量的时候,我们根据宽高取得一个正方形 //并初始化半径 int minTarget = Math.min(getMeasuredWidth(), getMeasuredHeight()); radius = minTarget / 2; //重新设置宽高 setMeasuredDimension(minTarget, minTarget); } @Override protected void onDraw(Canvas canvas) { paint = new Paint(); Bitmap bitmap = Utils.drawable2Bitmap(getDrawable()); if (bitmap == null){ return; } //构建BitmapShader对象,设置为CLAMP模式,当所画图形的尺寸小于bitmap尺寸的时候,会对bitmap进行裁剪 BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); //我们要对bitmap进行缩放处理 //radius * 2为宽高,再取bitmap的宽高中值小的进行相除,取得bitmap缩放比例 mScale = (radius * 2.0f) / Math.min(bitmap.getWidth(), bitmap.getHeight()); //设置矩阵,针对bitmap作缩放处理 Matrix matrix = new Matrix(); matrix.setScale(mScale, mScale); bitmapShader.setLocalMatrix(matrix); paint.setShader(bitmapShader); //这里开始画一个圆形,并对paint设置的BitmapShader中的bitmap进行裁剪处理 canvas.drawCircle(radius, radius, radius, paint); // 得到自定义视图的高度 int viewHeight; // 得到自定义视图的宽度 int viewWidth; // 得到自定义视图的X轴中心点 int viewCenterX; // 得到自定义视图的Y轴中心点 int viewCenterY; viewHeight = getMeasuredHeight(); viewWidth = getMeasuredWidth(); viewCenterX = viewWidth / 2; viewCenterY = viewHeight / 2; shadeColor=0xDF222222; Paint mPaint = new Paint(); mPaint.setColor(getResources().getColor(R.color.noprogress));//14549B mPaint.setStrokeWidth(10); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); RectF rectF = new RectF(); rectF.left = viewCenterX - radius+5; rectF.top = viewCenterY - radius+5; rectF.right = viewCenterX + radius-5; rectF.bottom = viewCenterY + radius-5; canvas.drawArc(rectF, 0, 360, false, mPaint);//画边框 // canvas.drawPath(path, mPaint); } }
使用
<com.tianxin.views.BitmapShaderCircularView android:layout_width="90dp" android:layout_height="90dp" android:src="@mipmap/jcss_03"/>