import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.blankj.utilcode.util.ConvertUtils;
import com.hanvonscanner.common.R;
public class CornerConstraintLayout extends ConstraintLayout {
private static final float RADIUS_DEFAULT = -1f;
private Paint mPaint;
private float mRadius;
private float mTopLeftRadius, mTopRightRadius, mBottomLeftRadius, mBottomRightRadius;
private float[] corners;
public CornerConstraintLayout(@NonNull Context context) {
this(context, null);
}
public CornerConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CornerConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CornerConstraintLayout);
mRadius = typedArray.getDimension(R.styleable.CornerConstraintLayout_android_radius, RADIUS_DEFAULT);
mTopLeftRadius = typedArray.getDimension(R.styleable.CornerConstraintLayout_android_topLeftRadius, RADIUS_DEFAULT);
mTopRightRadius = typedArray.getDimension(R.styleable.CornerConstraintLayout_android_topRightRadius, RADIUS_DEFAULT);
mBottomLeftRadius = typedArray.getDimension(R.styleable.CornerConstraintLayout_android_bottomLeftRadius, RADIUS_DEFAULT);
mBottomRightRadius = typedArray.getDimension(R.styleable.CornerConstraintLayout_android_bottomRightRadius, RADIUS_DEFAULT);
typedArray.recycle();
mPaint = new Paint();
mPaint.setAntiAlias(true);
if (mRadius <= RADIUS_DEFAULT){
mRadius = 0;
}
corners = new float[]{
mRadius, mRadius, // Top left radius in px
mRadius, mRadius, // Top right radius in px
mRadius, mRadius, // Bottom right radius in px
mRadius, mRadius, // Bottom left radius in px
};
if (mTopLeftRadius > RADIUS_DEFAULT){
corners[0] = mTopLeftRadius;
corners[1] = mTopLeftRadius;
}
if (mTopRightRadius > RADIUS_DEFAULT){
corners[2] = mTopRightRadius;
corners[3] = mTopRightRadius;
}
if (mBottomRightRadius > RADIUS_DEFAULT){
corners[4] = mBottomRightRadius;
corners[5] = mBottomRightRadius;
}
if (mBottomLeftRadius > RADIUS_DEFAULT){
corners[6] = mBottomLeftRadius;
corners[7] = mBottomLeftRadius;
}
}
@Override
protected void onDraw(Canvas canvas) {
RectF rect = new RectF(0, 0, getWidth(), getHeight());
Path path = new Path();
path.addRoundRect(rect, corners, Path.Direction.CW);
canvas.clipPath(path);
}
}
自定义属性:
<declare-styleable name="CornerConstraintLayout">
<attr name="android:radius" />
<!-- Radius of the top left corner. -->
<attr name="android:topLeftRadius" />
<!-- Radius of the top right corner. -->
<attr name="android:topRightRadius" />
<!-- Radius of the bottom left corner. -->
<attr name="android:bottomLeftRadius" />
<!-- Radius of the bottom right corner. -->
<attr name="android:bottomRightRadius" />
</declare-styleable>