Android--›圆角图片,圆角任意View,圆角父布局Layout(任意形状的View且超简洁实现)

相信大家对圆角图片已经非常熟悉了,但是圆角任意View,和圆角父布局,甚至是任意形状的View,肯定还是比较陌生的.

今天就揭开她的面纱.

圆角图片移步:http://blog.csdn.net/lmj623565791/article/details/24555655
View的Draw过程移步:http://blog.csdn.net/fener10289/article/details/8231712

//通常情况下,圆角图片是这样的...
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx,
		int number) {
	int w = bitmap.getWidth();
	int h = bitmap.getHeight();
	Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
	Canvas canvas = new Canvas(output);
	final int color = 0xdd424242;
	final Paint paint = new Paint();
	final Rect rect = new Rect(0, 0, w, h);
	final RectF rectF = new RectF(rect);
	paint.setAntiAlias(true);
	number = number * 255 / 100;
	paint.setAlpha(number);
	canvas.drawARGB(0, 0, 0, 0);
	paint.setColor(color);
	canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
	paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
	canvas.drawBitmap(bitmap, rect, rect, paint);
	return output;
}

上图为证:
这里写图片描述

其实最核心的代码,就一行.(真的是对得起标题, 超简洁的实现啊…)
在View的draw方法中,加入:(这个方法可以在任意一个View的子类中添加,包括ImageView)

@Override
public void draw(Canvas canvas) {
	//roundPath是什么形状,绘制出来的Layout就是什么形状的....相当于任意View了.
    canvas.clipPath(roundPath);//一篇文章就是为了这一样代码....
    super.draw(canvas);
}

以下是我的使用方式:

public class RoundLayout extends RelativeLayout {
 private float roundLayoutRadius = 14f;
 private Path roundPath;
 private RectF rectF;

 public RoundLayout(Context context) {
     this(context, null);
 }

 public RoundLayout(Context context, AttributeSet attrs) {
     super(context, attrs);

     TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundLayout);
     roundLayoutRadius = typedArray.getDimensionPixelSize(R.styleable.RoundLayout_roundLayoutRadius, (int) roundLayoutRadius);
     typedArray.recycle();

     init();
 }

 private void init() {
     setWillNotDraw(false);//如果你继承的是ViewGroup,注意此行,否则draw方法是不会回调的;
     roundPath = new Path();
     rectF = new RectF();
 }

 private void setRoundPath() {
	 //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行
     roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW);
 }


 public void setRoundLayoutRadius(float roundLayoutRadius) {
     this.roundLayoutRadius = roundLayoutRadius;
     setRoundPath();
     postInvalidate();
 }

 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
     super.onLayout(changed, l, t, r, b);
     rectF.set(0f, 0f, getMeasuredWidth(), getMeasuredHeight());
     setRoundPath();
 }

 @Override
 public void draw(Canvas canvas) {
     if (roundLayoutRadius > 0f) {
         canvas.clipPath(roundPath);
     }
     super.draw(canvas);
 }
}

ImageView的圆角,其实也是那一行代码可以搞定的.不阐述了,快快行动,用行动证明自己吧.

源码参考


补充:
上述方法会有明显的锯齿情况,因为Paint才提供抗锯齿方法.

解决方法: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0420/4167.html

源代码移步:
https://github.com/angcyo/RoundAngleFrameLayout/blob/master/app/src/main/java/com/ybao/rf/RoundAngleFrameLayout.java


至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值