边缘渐变布局
@SuppressLint("NewApi")
public class EdeFadelaout extends LinearLayout {
public static final int TOP = 1;
public static final int BOTTOM = TOP << 1;
public static final int START = TOP << 2;
public static final int END = TOP << 3;
private static final int[] GRADIENT_COLORS = { Color.WHITE,
Color.TRANSPARENT };
private int direction;
private Paint mPaint;
private Paint mPaddingPaint;
private int mFadeLength = 40;
private int mWidth, mHeight;
public EdeFadelaout(Context context) {
this(context, null);
}
public EdeFadelaout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL);
mPaddingPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaddingPaint.setStyle(Paint.Style.FILL);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mPaddingPaint.setColor(GRADIENT_COLORS[0]);
mPaint.setShader(new LinearGradient(0, 0, 0, mFadeLength,
GRADIENT_COLORS, null, Shader.TileMode.CLAMP));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
invalidate();
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
int layerSave = canvas.saveLayer(0, 0, mWidth, mHeight, null,
Canvas.ALL_SAVE_FLAG);
boolean res = super.drawChild(canvas, child, drawingTime);
int width = getWidth();
int height = getHeight();
if ((direction & TOP) != 0) {
int saveCount = canvas.save();
int paddingTop = getPaddingTop();
if (paddingTop > 0) {
canvas.drawRect(0, 0,width, paddingTop, mPaddingPaint);
canvas.translate(0, paddingTop);
}
canvas.drawRect(0, 0, width, mFadeLength, mPaint);
canvas.restoreToCount(saveCount);
}
if ((direction & BOTTOM) != 0) {
int saveCount = canvas.save();
int paddingBottom = getPaddingBottom();
canvas.rotate(180, width >> 1, height >> 1);
if (paddingBottom > 0) {
canvas.drawRect(0, 0, width, paddingBottom, mPaddingPaint);
canvas.translate(0, paddingBottom);
}
canvas.drawRect(0, 0, width, mFadeLength, mPaint);
canvas.restoreToCount(saveCount);
}
int offset = (mHeight - mWidth)>>1;
if ((direction & START) != 0) {
int saveCount = canvas.save();
boolean isLTR = getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
int paddingStart = getPaddingStart();
canvas.rotate(isLTR ? 270 : 90, width>> 1,height >> 1);
canvas.translate(0, offset-1);
if (paddingStart > 0) {
canvas.drawRect(-offset, 0, width + offset, paddingStart, mPaddingPaint);
canvas.translate(0, paddingStart);
}
canvas.drawRect(-offset, 0, width + offset, mFadeLength, mPaint);
canvas.restoreToCount(saveCount);
}
if((direction & END) != 0){
int saveCount = canvas.save();
boolean isLTR = getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
int paddingeEnd = getPaddingEnd();
canvas.rotate(isLTR ? 90 : 270, width>> 1,height >> 1);
canvas.translate(0, offset-1);
if (paddingeEnd > 0) {
canvas.drawRect(-offset, 0, width + offset, paddingeEnd, mPaddingPaint);
canvas.translate(0, paddingeEnd);
}
canvas.drawRect(-offset, 0, width + offset, mFadeLength, mPaint);
canvas.restoreToCount(saveCount);
}
canvas.restoreToCount(layerSave);
return res;
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
if (this.direction != direction) {
this.direction = direction;
invalidate();
}
}
// public void setFadeLength(int fadeLength) {
// this.mFadeLength = fadeLength;
// invalidate();
// }
}
效果图: