Android实现圆角ImageView
16lz
2021-01-23
Android实现圆角ImageView
code : https://github.com/HungryGoogle/LeeCustomView
效果图如下:
实现步骤:
1、新增RoundAngleImageView文件,实现自定义view。
原理:1、重新绘制,采用Mode.DST_OUT去掉重叠部分的原理,先制作重贴部分,删除重叠部分即可
2、分别用原理1,在4个角制作出圆角部分,去掉4个角
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.RectF;import android.util.AttributeSet;import android.widget.ImageView;/** * 实现圆角头像 */public class RoundAngleImageView extends ImageView { private static final int defaultCornerSize = 20; // 单位dp private Paint paint; private Paint paint2; /** * 根据3点确定一个圆的原理,顶点,向横向边延伸roundWidth确定第2个点,向纵向边延伸确定第3个点。 * 然后去掉圆外面部分 */ private int roundWidth = defaultCornerSize; private int roundHeight = defaultCornerSize; public RoundAngleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } public RoundAngleImageView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public RoundAngleImageView(Context context) { super(context); init(context, null); } private void init(Context context, AttributeSet attrs) { if (attrs != null) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundAngleImageView); roundWidth = a.getDimensionPixelSize(R.styleable.RoundAngleImageView_roundWidth, roundWidth); roundHeight = a.getDimensionPixelSize(R.styleable.RoundAngleImageView_roundHeight, roundHeight); } else { float density = context.getResources().getDisplayMetrics().density; roundWidth = (int) (roundWidth * density); roundHeight = (int) (roundHeight * density); } paint = new Paint(); paint.setColor(Color.WHITE); paint.setAntiAlias(true); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); paint2 = new Paint(); paint2.setXfermode(null); } @Override public void draw(Canvas canvas) { Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); Canvas canvas2 = new Canvas(bitmap); super.draw(canvas2); // 分别裁剪4个角 drawLeftUp(canvas2); drawLeftDown(canvas2); drawRightUp(canvas2); drawRightDown(canvas2); canvas.drawBitmap(bitmap, 0, 0, paint2); bitmap.recycle(); } private void drawLeftUp(Canvas canvas) { Path path = new Path(); path.moveTo(0, roundHeight); path.lineTo(0, 0); path.lineTo(roundWidth, 0); path.arcTo(new RectF(0, 0, roundWidth * 2, roundHeight * 2), -90, -90); path.close(); canvas.drawPath(path, paint); } private void drawLeftDown(Canvas canvas) { Path path = new Path(); path.moveTo(0, getHeight() - roundHeight); path.lineTo(0, getHeight()); path.lineTo(roundWidth, getHeight()); path.arcTo(new RectF(0, getHeight() - roundHeight * 2, roundWidth * 2, getHeight()), 90, 90); path.close(); canvas.drawPath(path, paint); } private void drawRightDown(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth() - roundWidth, getHeight()); path.lineTo(getWidth(), getHeight()); path.lineTo(getWidth(), getHeight() - roundHeight); path.arcTo(new RectF(getWidth() - roundWidth * 2, getHeight() - roundHeight * 2, getWidth(), getHeight()), -0, 90); path.close(); canvas.drawPath(path, paint); } private void drawRightUp(Canvas canvas) { Path path = new Path(); path.moveTo(getWidth(), roundHeight); path.lineTo(getWidth(), 0); path.lineTo(getWidth() - roundWidth, 0); path.arcTo(new RectF(getWidth() - roundWidth * 2, 0, getWidth(), 0 + roundHeight * 2), -90, 90); path.close(); canvas.drawPath(path, paint); }}
<?xml version="1.0" encoding="utf-8"?>
3、在布局文件中可以直接使用,如果包名不一致,请替换包名
4、运行即可看到效果
https://github.com/HungryGoogle/LeeCustomView
更多相关文章
- Android Json 使用jsonschema2pojo生成.java文件文件
- android camera以时间来命名照片文件
- android编辑布局文件时非要降低api level或者更改主题才能显示布
- Android学习笔记-Android非布局activity中布局文件及控件加载方
- 给Android增加分享库.so文件
- Android的log保存到文件上查看
- Android应用程序中Manifest.java文件的介绍
- Android多文件断点续传(三)——实现文件断点续传