Android圆角自定义View
16lz
2022-06-11
方案一:
可以自由设置四个角的圆角
public class MMMImageView extends ImageView { public MMMImageView(Context context) { super(context); } public MMMImageView(Context context, AttributeSet attrs) { super(context, attrs); } public MMMImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } // 四个角的x,y半径 private float[] radiusArray = { 50f, 50f, 50f, 0f, 50f, 50f, 50f, 50f }; private Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Bitmap makeRoundRectFrame(int w, int h) { Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bm); Path path = new Path(); path.addRoundRect(new RectF(0, 0, w, h), radiusArray, Path.Direction.CW); Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); bitmapPaint.setColor(Color.GREEN); // 颜色随意,不要有透明度。 c.drawPath(path, bitmapPaint); return bm; } Bitmap bitmapFrame; @Override protected void onDraw(Canvas canvas) { // 得到原始的图片 final int w = getWidth(); final int h = getHeight(); Bitmap bitmapOriginal = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmapOriginal); super.onDraw(c); if (bitmapFrame == null) { bitmapFrame = makeRoundRectFrame(w, h); } int sc = canvas.saveLayer(0, 0, w, h, null, Canvas.ALL_SAVE_FLAG); canvas.drawBitmap(bitmapFrame, 0, 0, bitmapPaint); // 利用Xfermode取交集(利用bitmapFrame作为画框来裁剪bitmapOriginal) bitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmapOriginal, 0, 0, bitmapPaint); bitmapPaint.setXfermode(null); canvas.restoreToCount(sc); }}
方案二:
public class CornerView extends View { private final RectF roundRect = new RectF(); private float rect_adius = 600; private final Paint maskPaint = new Paint(); private final Paint zonePaint = new Paint(); public CornerView(Context context) { super(context); init(); } public CornerView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CornerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { maskPaint.setAntiAlias(true); maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); // zonePaint.setAntiAlias(true); zonePaint.setColor(Color.WHITE); // float density = getResources().getDisplayMetrics().density; rect_adius = rect_adius * density; } public void setCorner(float adius) { rect_adius = adius; invalidate(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); int w = getWidth(); int h = getHeight(); roundRect.set(0, 0, w, h); } @Override public void draw(Canvas canvas) { canvas.saveLayer(roundRect, zonePaint, Canvas.ALL_SAVE_FLAG); canvas.drawRoundRect(roundRect, rect_adius, rect_adius, zonePaint); canvas.saveLayer(roundRect, maskPaint, Canvas.ALL_SAVE_FLAG); super.draw(canvas); canvas.restore(); }}
更多相关文章
- Caused by: java.lang.ClassNotFoundException: Didn’t find cl
- [Android]Android(安卓)Studio导入第三方工程库,以PullToRefreshV
- Android之adt 23找不到NDK路径设置解决方案
- Android黄色警告汇总
- 利用androidannotations的@Rest注解替换Spring Android(安卓)Res
- Android(安卓)图片裁剪之三剑式(二)
- Android利用setLayoutParams在代码中调整布局(Margin和居中)
- 【Android】TextView动态设置android:drawableLeft|Right|Top|Bo
- 基于百度地图的android地理位置获取