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.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
public class RoundImageView extends androidx.appcompat.widget.AppCompatImageView {
private Paint mPaint;
Path path = new Path();
// 3x3 矩阵,主要用于缩小放大
private Matrix mMatrix;
//渲染图像,使用图像为绘制图形着色
private BitmapShader mBitmapShader;
private float[] radiusArray = { 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f };
RectF rectF = new RectF(0, 0, 1280, 345);
public RoundImageView(Context context) {
this(context, null);
}
public RoundImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mMatrix = new Matrix();
mPaint = new Paint();
mPaint.setAntiAlias(true);
setRadius(0,0,30,30);
}
public void setRadius(float leftTop, float rightTop, float rightBottom, float leftBottom) {
radiusArray[0] = leftTop;
radiusArray[1] = leftTop;
radiusArray[2] = rightTop;
radiusArray[3] = rightTop;
radiusArray[4] = rightBottom;
radiusArray[5] = rightBottom;
radiusArray[6] = leftBottom;
radiusArray[7] = leftBottom;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
if (getDrawable() == null){
return;
}
Bitmap bitmap = drawableToBitamp(getDrawable());
mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(mBitmapShader);
// 正方形经处理后变为圆形
path.reset();
path.addRoundRect(rectF, radiusArray, Path.Direction.CW);
canvas.drawPath(path,mPaint);
}
private Bitmap drawableToBitamp(Drawable drawable)
{
BitmapDrawable bd = (BitmapDrawable) drawable;
return bd.getBitmap();
}
}
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
/**
*
* 自定义控件:圆角RelativeLayout
* 如果想改为圆形view,修改rect_adius为很大的数字,比如100
* 四个圆角
*/
public class RoundRelativeLayout extends RelativeLayout {
private final RectF roundRect = new RectF();
private final Paint maskPaint = new Paint();
private final Paint zonePaint = new Paint();
private Context mContext;
private float rect_adius = 8; //单位为像素
public RoundRelativeLayout(Context context) {
super(context);
init(context);
}
public RoundRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RoundRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
this.mContext = context;
maskPaint.setAntiAlias(true);
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
zonePaint.setAntiAlias(true);
zonePaint.setColor(Color.WHITE);
}
@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();
roundRectSet(w, h);
}
@Override
public void draw(Canvas canvas) {
canvasSetLayer(canvas);
super.draw(canvas);
canvas.restore();
}
/**
* 从新设置圆角
*
* @param adius
*/
public void setRectAdius(float adius) {
rect_adius = adius;
invalidate();
}
/**
* 圆角区域设置
*
* @param width
* @param height
*/
private void roundRectSet(int width, int height) {
roundRect.set(0, 0, width, height);
}
/**
* 画布区域裁剪
*
* @param canvas
*/
private void canvasSetLayer(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);
}
}
package com.example.teset;
import android.content.Context;
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.RelativeLayout;
/**
* 顶部两个直角
* 底部两个圆角
*
*/
public class RoundRelativeLayout extends RelativeLayout {
private final RectF roundRect = new RectF();
private final Paint maskPaint = new Paint();
private final Paint zonePaint = new Paint();
private Context mContext;
private float rect_adius = 8; //单位为像素
private float[] radiusArray = { 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f };
Path path = new Path();
public RoundRelativeLayout(Context context) {
super(context);
init(context);
}
public RoundRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RoundRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public void setRadius(float leftTop, float rightTop, float rightBottom, float leftBottom) {
radiusArray[0] = leftTop;
radiusArray[1] = leftTop;
radiusArray[2] = rightTop;
radiusArray[3] = rightTop;
radiusArray[4] = rightBottom;
radiusArray[5] = rightBottom;
radiusArray[6] = leftBottom;
radiusArray[7] = leftBottom;
invalidate();
}
private void init(Context context) {
this.mContext = context;
maskPaint.setAntiAlias(true);
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
zonePaint.setAntiAlias(true);
zonePaint.setColor(Color.WHITE);
setRadius(0,0,30,30);
}
@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();
roundRectSet(w, h);
}
@Override
public void draw(Canvas canvas) {
canvasSetLayer(canvas);
super.draw(canvas);
canvas.restore();
}
/**
* 从新设置圆角
*
* @param adius
*/
public void setRectAdius(float adius) {
rect_adius = adius;
invalidate();
}
/**
* 圆角区域设置
*
* @param width
* @param height
*/
private void roundRectSet(int width, int height) {
roundRect.set(0, 0, width, height);
}
/**
* 画布区域裁剪
*
* @param canvas
*/
private void canvasSetLayer(Canvas canvas) {
canvas.saveLayer(roundRect, zonePaint, Canvas.ALL_SAVE_FLAG);
// canvas.drawRoundRect(roundRect, rect_adius, rect_adius, zonePaint);
path.reset();
path.addRoundRect(new RectF(0, 0, 400, 300), radiusArray, Path.Direction.CW);
canvas.drawPath(path, zonePaint);
//
canvas.saveLayer(roundRect, maskPaint, Canvas.ALL_SAVE_FLAG);
}
}