這兩天因為項目有個地方需要用到扇形的剪裁區
在網上找相關資料
找到一個方法,但是用起來確實錯的,而且不能隨意的指定圓心的很縱坐標
我查相關Api和看ApiDemo發現有畫扇形的方法
但是關於剪裁的沒有剪裁扇形的方法
有一個剪裁弧形的方法,
addArc(RectF oval, float startAngle, float sweepAngle)
Add the specified arc to the path as a new contour.
第一個參數是你弧形的畫的矩形范圍,就是你的圓弧畫滿後是內切的
第二個參數是起始的角度
第三個參數是移動的度數 ,所以終點度數是第二個參數加上第三個參數
效果如下圖
我們需要的是個扇形,所以要加上一個從圓形到圓邊起始點再到圓邊終點的三角形 的剪裁區拼成一個剪裁區
就是三個點相連的路徑
用Path裡面的moveTo和linkTo方法便可以完成
我寫瞭一個方法 傳入圓心坐標和半徑 加上起始和終點角度 代碼如下:
/**
* 返回一個扇形的剪裁區
* @param canvas //畫筆
* @param center_X //圓心X坐標
* @param center_Y //圓心Y坐標
* @param r //半徑
* @param startAngle //起始角度
* @param sweepAngle //終點角度
*
*/
private void getSectorClip(Canvas canvas,float center_X,float center_Y,float r,float startAngle,float sweepAngle)
{
Path path = new Path();
//下面是獲得一個三角形的剪裁區
path.moveTo(center_X, center_Y); //圓心
path.lineTo((float)(center_X+r*Math.cos(startAngle* Math.PI / 180)), //起始點角度在圓上對應的橫坐標
(float)(center_Y+r*Math.sin(startAngle* Math.PI / 180))); //起始點角度在圓上對應的縱坐標
path.lineTo((float)(center_X+r*Math.cos(sweepAngle* Math.PI / 180)), //終點角度在圓上對應的橫坐標
(float)(center_Y+r*Math.sin(sweepAngle* Math.PI / 180))); //終點點角度在圓上對應的縱坐標
path.close();
// //設置一個正方形,內切圓
RectF rectF = new RectF(center_X-r,center_Y-r,center_X+r,center_Y+r);
//下面是獲得弧形剪裁區的方法
path.addArc(rectF, startAngle, sweepAngle – startAngle);
canvas.clipPath(path);
}
效果圖如下:
摘自 kbest的專欄