`
836811384
  • 浏览: 550724 次
文章分类
社区版块
存档分类
最新评论

Android中获得一个扇形的剪裁区

 
阅读更多

这两天因为项目有个地方需要用到扇形的剪裁区

在网上找相关资料

找到一个方法,但是用起来确实错的,而且不能随意的指定圆心的很纵坐标

我查相关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);
	}


效果图如下:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics