package com.owen.tvrecyclerview.example;
import android.content.Context;
import android.content.res.TypedArray;
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.FrameLayout;
/**
* Created by owen on 2016/10/20.
*/
public class RoundAngleFrameLayout extends FrameLayout {
private float topLeftRadius;
private float topRightRadius;
private float bottomLeftRadius;
private float bottomRightRadius;
private Paint roundPaint;
private Paint imagePaint;
public RoundAngleFrameLayout(Context context) {
this(context, null);
}
public RoundAngleFrameLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundAngleFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (attrs != null) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundAngleFrameLayout);
float radius = ta.getDimension(R.styleable.RoundAngleFrameLayout_ral_radius, 0);
topLeftRadius = ta.getDimension(R.styleable.RoundAngleFrameLayout_topLeftRadius, radius);
topRightRadius = ta.getDimension(R.styleable.RoundAngleFrameLayout_topRightRadius, radius);
bottomLeftRadius = ta.getDimension(R.styleable.RoundAngleFrameLayout_bottomLeftRadius, radius);
bottomRightRadius = ta.getDimension(R.styleable.RoundAngleFrameLayout_bottomRightRadius, radius);
ta.recycle();
}
roundPaint = new Paint();
roundPaint.setColor(Color.WHITE);
roundPaint.setAntiAlias(true);
roundPaint.setStyle(Paint.Style.FILL);
roundPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
imagePaint = new Paint();
imagePaint.setXfermode(null);
}
////实现1
// @Override
// protected void dispatchDraw(Canvas canvas) {
// int width = getWidth();
// int height = getHeight();
// Path path = new Path();
// path.moveTo(0, topLeftRadius);
// path.arcTo(new RectF(0, 0, topLeftRadius * 2, topLeftRadius * 2), -180, 90);
// path.lineTo(width - topRightRadius, 0);
// path.arcTo(new RectF(width - 2 * topRightRadius, 0, width, topRightRadius * 2), -90, 90);
// path.lineTo(width, height - bottomRightRadius);
// path.arcTo(new RectF(width - 2 * bottomRightRadius, height - 2 * bottomRightRadius, width, height), 0, 90);
// path.lineTo(bottomLeftRadius, height);
// path.arcTo(new RectF(0, height - 2 * bottomLeftRadius, bottomLeftRadius * 2, height), 90, 90);
// path.close();
// canvas.clipPath(path);
// super.dispatchDraw(canvas);
// }
////实现2
// @Override
// protected void dispatchDraw(Canvas canvas) {
// super.dispatchDraw(canvas);
// drawTopLeft(canvas);//用PorterDuffXfermode
// drawTopRight(canvas);//用PorterDuffXfermode
// drawBottomLeft(canvas);//用PorterDuffXfermode
// drawBottomRight(canvas);//用PorterDuffXfermode
// }
////实现3
// @Override
// protected void dispatchDraw(Canvas canvas) {
// Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
// Canvas newCanvas = new Canvas(bitmap);
// super.dispatchDraw(newCanvas);
// drawTopLeft(newCanvas);
// drawTopRight(newCanvas);
// drawBottomLeft(newCanvas);
// drawBottomRight(newCanvas);
// canvas.drawBitmap(bitmap, 0, 0, imagePaint);
//// invalidate();
// }
//实现4
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.saveLayer(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), imagePaint, Canvas.ALL_SAVE_FLAG);
super.dispatchDraw(canvas);
drawTopLeft(canvas);
drawTopRight(canvas);
drawBottomLeft(canvas);
drawBottomRight(canvas);
canvas.restore();
}
private void drawTopLeft(Canvas canvas) {
if (topLeftRadius > 0) {
Path path = new Path();
path.moveTo(0, topLeftRadius);
path.lineTo(0, 0);
path.lineTo(topLeftRadius, 0);
path.arcTo(new RectF(0, 0, topLeftRadius * 2, topLeftRadius * 2),
-90, -90);
path.close();
canvas.drawPath(path, roundPaint);
}
}
private void drawTopRight(Canvas canvas) {
if (topRightRadius > 0) {
int width = getWidth();
Path path = new Path();
path.moveTo(width - topRightRadius, 0);
path.lineTo(width, 0);
path.lineTo(width, topRightRadius);
path.arcTo(new RectF(width - 2 * topRightRadius, 0, width,
topRightRadius * 2), 0, -90);
path.close();
canvas.drawPath(path, roundPaint);
}
}
private void drawBottomLeft(Canvas canvas) {
if (bottomLeftRadius > 0) {
int height = getHeight();
Path path = new Path();
path.moveTo(0, height - bottomLeftRadius);
path.lineTo(0, height);
path.lineTo(bottomLeftRadius, height);
path.arcTo(new RectF(0, height - 2 * bottomLeftRadius,
bottomLeftRadius * 2, height), 90, 90);
path.close();
canvas.drawPath(path, roundPaint);
}
}
private void drawBottomRight(Canvas canvas) {
if (bottomRightRadius > 0) {
int height = getHeight();
int width = getWidth();
Path path = new Path();
path.moveTo(width - bottomRightRadius, height);
path.lineTo(width, height);
path.lineTo(width, height - bottomRightRadius);
path.arcTo(new RectF(width - 2 * bottomRightRadius, height - 2
* bottomRightRadius, width, height), 0, 90);
path.close();
canvas.drawPath(path, roundPaint);
}
}
}