Android 中任意View实现圆角

在咱们实际的项目开发中,经常会遇到需要把整个View裁剪成圆角的那种。如果用shape来做,那么圆角依旧裁剪不掉。

谷歌出品过一个叫CardView的控件,可以很方便的设置圆角。但是这个在Android 5.0以下不兼容。

最近项目要用到这个,所以我就想起了很早之前我在谷歌的源码里找到过一个比较简单的实现方案,这里贴一下,以后谁搜到我这篇博客可以直接使用了。

代码贴一下,就一个类,很简单。

public class CornerView extends FrameLayout {

	public CornerView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public CornerView(Context context) {
		super(context);
		init();
	}

	private final RectF roundRect = new RectF();
	private float rect_adius = 10;
	private final Paint maskPaint = new Paint();
	private final Paint zonePaint = new Paint();

	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();
	}

}

其中,rect_adius是角度,可以外部设置进去。FrameLayout可以换成RelativeLayout,LinearLayout 等。

任何被包裹进去的View都会被裁剪成圆角。

重要提示:得对这个View 设置一个background color 圆角才生效。

2016-11-25补充:经过我们项目测试,这个在ListView、RecyclerView中性能很差,导致滑动不流畅,原因是绘制花费时间。

===============================
如果你觉得帮到了你,请给作者打赏一口饭吃:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android在系统层面实现圆角效果主要有两种方式: 1. 使用XML文件定义Shape 可以通过在drawable目录下创建XML文件定义Shape,在其设置圆角半径来实现圆角效果。具体步骤如下: - 在drawable目录下创建一个XML文件,例如:round_rect.xml - 在文件定义Shape,设置圆角半径和背景颜色,例如: ``` <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="10dp" /> <solid android:color="@color/colorPrimary" /> </shape> ``` - 在需要使用圆角效果的View引用该Shape,例如: ``` <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/your_image" android:background="@drawable/round_rect"/> ``` 2. 使用View的setClipToOutline方法 在Android 5.0及以上版本View提供了setClipToOutline方法,可以通过该方法将View的形状裁剪成圆角矩形。具体步骤如下: - 在布局文件设置需要使用圆角效果的View的形状为矩形,例如: ``` <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/your_image" android:background="@color/colorPrimary" android:outlineProvider="background" android:clipToOutline="true"/> ``` - 在Java代码调用setClipToOutline方法,例如: ``` imageView.setClipToOutline(true); ``` 以上两种方式都可以实现圆角效果,具体选择哪种方式取决于实际需求和个人偏好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值