package com.smartisanos.sidebar.view; import com.smartisanos.sidebar.R; import android.content.Context; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Path.Direction; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.FrameLayout; public class RoundCornerFrameLayout extends FrameLayout { private float mRadius; private Path mClip; private Drawable mViewMask; public RoundCornerFrameLayout(Context context) { this(context, null); } public RoundCornerFrameLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundCornerFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public RoundCornerFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mRadius = context.getResources().getDimensionPixelSize(R.dimen.clip_radius); mViewMask = context.getDrawable(R.drawable.view_mask); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mClip = new Path(); RectF rectRound = new RectF(this.mPaddingLeft, this.mPaddingTop, w - this.mPaddingRight, h - this.mPaddingBottom); mClip.addRoundRect(rectRound, mRadius, mRadius, Direction.CW); } @Override protected void dispatchDraw(Canvas canvas) { int saveCount = canvas.save(); canvas.clipPath(mClip); super.dispatchDraw(canvas); // draw mask int bottom = mScrollY + mBottom - mTop - mPaddingBottom; mViewMask.setBounds(mScrollX + mPaddingLeft, bottom - mViewMask.getMinimumHeight(), mScrollX + mRight - mLeft - mPaddingRight, bottom); mViewMask.draw(canvas); canvas.restoreToCount(saveCount); } }