目录
罗列一下Android实现圆角有哪些方案
使用xml的shape来实现圆角
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="10dp" />
<solid android:color="@color/colorAccent" />
使用GradientDrawable来实现圆角
GradientDrawable gradientDrawable1 = new GradientDrawable();
gradientDrawable1.setShape(GradientDrawable.RECTANGLE);
gradientDrawable1.setCornerRadius(DisplayUtils.dp2px(this, 10F));
gradientDrawable1.setColor(getResources().getColor(R.color.colorPrimary));
使用RoundRectDrawable来实现圆角
void setRadius(float radius) {
if (radius == mRadius) {
return;
}
mRadius = radius;
updateBounds(null);
invalidateSelf();
}
使用CardView来实现圆角
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardBackgroundColor="@color/gray_d9d9d9"
app:contentPadding="1px"
app:cardElevation="1px"
app:cardCornerRadius="4dp">
使用Canvas来实现
这个属于作弊了,毕竟大部分实现方法底层都是这么做的
Path path = new Path();
RectF rectF = new RectF(0, 0, mWidth, mHeight);
if (mCorners > 0F) {
path.addRoundRect(rectF, mCorners, mCorners, Path.Direction.CCW);
} else {
float[] radii = new float[]{
mLeftTopCorner, mLeftTopCorner,
mRightTopCorner, mRightTopCorner,
mRightBottomCorner, mRightBottomCorner,
mLeftBottomCorner, mLeftBottomCorner
};
path.addRoundRect(rectF, radii, Path.Direction.CCW);
}
canvas.clipPath(path);
或者
final Paint paint = mPaint;
final boolean clearColorFilter;
if (mTintFilter != null && paint.getColorFilter() == null) {
paint.setColorFilter(mTintFilter);
clearColorFilter = true;
} else {
clearColorFilter = false;
}
canvas.drawRoundRect(mBoundsF, mRadius, mRadius, paint);
if (clearColorFilter) {
paint.setColorFilter(null);
}
使用ViewoutlineProvider
view.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), DisplayUtils.dp2px(ViewOutlineProviderActivity.this, 10F));
}
});
view.setClipToOutline(true);