package moe.feng.nevo.decorators.enscreenshot.widget; import android.content.Context; import android.graphics.Outline; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.view.ViewOutlineProvider; import android.widget.FrameLayout; import androidx.annotation.Nullable; import moe.feng.nevo.decorators.enscreenshot.R; public class RoundRectFrameLayout extends FrameLayout { public RoundRectFrameLayout(Context context) { super(context); init(); } public RoundRectFrameLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public RoundRectFrameLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public RoundRectFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { setClipToOutline(true); setOutlineProvider(new RoundRectOutlineProvider( getResources().getDimension(R.dimen.floating_window_corner_radius))); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); invalidateOutline(); } private static class RoundRectOutlineProvider extends ViewOutlineProvider { private final float mCornerRadius; RoundRectOutlineProvider(float cornerRadius) { mCornerRadius = cornerRadius; } @Override public void getOutline(View view, Outline outline) { final Rect clipPath = new Rect(); view.getLocalVisibleRect(clipPath); outline.setRoundRect(clipPath, mCornerRadius); } } }