package com.example.clipviewdemo; import android.content.Context; 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.os.Build; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; public class RoundCornerLayout extends FrameLayout { private int mRadius = 50; private Paint mPaint = new Paint(); private Path mPath = new Path(); public RoundCornerLayout(Context context) { this(context, null); } public RoundCornerLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundCornerLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); fixClipPathUnsupportedOperationException(this); mPaint = new Paint(); mPaint.setColor(Color.WHITE); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); setWillNotDraw(false); } @Override public void draw(Canvas canvas) { RectF leftRect1 = new RectF(0, 0, mRadius, mRadius); // 上端兩個圓角,下端是兩個直角圖形 mPath.arcTo(leftRect1,180,90); RectF leftRect2 = new RectF(getWidth() - mRadius, 0, getWidth(), mRadius); mPath.arcTo(leftRect2,270,90); mPath.lineTo(getWidth(), getHeight()); mPath.lineTo(0, getHeight()); mPath.lineTo(0, mRadius); mPath.close(); canvas.save(); //裁剪canvas,限定繪製區域 canvas.clipPath(mPath); super.draw(canvas); canvas.restore(); } public static void fixClipPathUnsupportedOperationException(View view) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } }
上端兩個圓角,下端兩個直角
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.