2025-05-17

 

這兩天因為項目有個地方需要用到扇形的剪裁區

 

在網上找相關資料

 

找到一個方法,但是用起來確實錯的,而且不能隨意的指定圓心的很縱坐標

 

我查相關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的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *