CircleImageView
自定义圆形图片
package com.example.mybabytracker.util; 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.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Xfermode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import androidx.appcompat.widget.AppCompatImageView; import com.example.mybabytracker.R; public class CircleImageView extends AppCompatImageView { private int mSize; private Paint mPaint; private Xfermode mPorterDuffXfermode; public CircleImageView(Context context) { this(context,null); } public CircleImageView(Context context, AttributeSet attrs) { this(context, attrs,0); } public CircleImageView(Context context,AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ mPaint = new Paint(); mPaint.setDither(true); mPaint.setAntiAlias(true); mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = getMeasuredWidth(); int height = getMeasuredHeight(); mSize = Math.min(width,height); //取宽高的最小值 setMeasuredDimension(mSize,mSize); //设置CircleImageView为等宽高 } @Override protected void onDraw(Canvas canvas) { //获取sourceBitmap,即通过xml或者java设置进来的图片 Drawable drawable = getDrawable(); if (drawable == null) return; Bitmap sourceBitmap = ((BitmapDrawable)getDrawable()).getBitmap(); if (sourceBitmap != null){ //对图片进行缩放,以适应控件的大小 Bitmap bitmap = resizeBitmap(sourceBitmap,getWidth(),getHeight()); // drawCircleBitmapByXfermode(canvas,bitmap); //(1)利用PorterDuffXfermode实现 drawCircleBitmapByShader(canvas,bitmap); //(2)利用BitmapShader实现 } } private Bitmap resizeBitmap(Bitmap sourceBitmap,int dstWidth,int dstHeight){ int width = sourceBitmap.getWidth(); int height = sourceBitmap.getHeight(); float widthScale = ((float)dstWidth) / width; float heightScale = ((float)dstHeight) / height; //取最大缩放比 float scale = Math.max(widthScale,heightScale); Matrix matrix = new Matrix(); matrix.postScale(scale,scale); return Bitmap.createBitmap(sourceBitmap,0,0,width,height,matrix,true); } private void drawCircleBitmapByXfermode(Canvas canvas,Bitmap bitmap){ final int sc = canvas.saveLayer(0,0,getWidth(),getHeight(),null,Canvas.ALL_SAVE_FLAG); //绘制dst层 canvas.drawCircle(mSize / 2,mSize / 2,mSize / 2,mPaint); //设置图层混合模式为SRC_IN mPaint.setXfermode(mPorterDuffXfermode); //绘制src层 canvas.drawBitmap(bitmap,0,0,mPaint); canvas.restoreToCount(sc); } private void drawCircleBitmapByShader(Canvas canvas,Bitmap bitmap){ BitmapShader shader = new BitmapShader(bitmap,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP); mPaint.setColor(getContext().getColor(R.color.app_d)); mPaint.setShader(shader); canvas.drawCircle(mSize / 2,mSize /2 ,mSize / 2,mPaint); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-08-31 Android——Glide的使用和Glide缓存问题
2021-08-31 JavaWeb——Idea文件保存路径
2021-08-31 JavaWeb——DiskFileItemFactory