边缘渐变布局

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

}
 

效果图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值