#Canvas

##canvas简介
  每个canvas都有bitmap为其保存像素,canvas有两个构造函数,无参函数和一个bitmap参数的函数,Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);这样就创建了一个canvas对象,Android推荐使用有参函数。其实无参和有参数的构造函数都是需要创建一个bitmap,无参会默认创建一个。一个canvas需要一个bitmap来保存像素信息,当然也是可以没有bitmap,但是画的东西没有地方保存,也就没有意义。

##canvas的主要方法
  canvas主要有几种方法,draw…这类方法是用来画一下东西的,clip…就是用来裁剪的,还有scale,translate,skew,rotate是用来进行画布的变换,还有saveXXX和restoreXXX构成的画布锁定和还原。

##裁剪画布
  裁剪画布可以裁剪规则区域canvas.clipRect和裁剪不规则的区域canvas.clippath,第一个就是传进去一个矩形,然后裁剪剩下矩形区域的画布,第二个就是按路径裁剪。还有就是Region.Op,中文就是区域,这个在API21弃用了,但是还是写一下吧,这个就跟图形的组合模式差不多,Region.Op是个枚举类,

使用举例:

// 填充颜色  
canvas.drawColor(Color.BLUE);  

canvas.save();  

// 裁剪区域A  
canvas.clipRegion(mRegionA);  

// 再通过组合方式裁剪区域B  
canvas.clipRegion(mRegionB, Region.Op.DIFFERENCE);  

// 填充颜色  
canvas.drawColor(Color.RED);  

canvas.restore(); 

Rect、Cricle、Ovel等封闭的曲线都可以使用Region.Op。Region和Rect有什么区别呢?首先最重要的一点,Region表示的是一个区域,而Rect表示的是一个矩形,这是最根本的区别之一,其次,Region有个很特别的地方是它不受Canvas的变换影响,Canvas的local不会直接影响到Region自身。

##Path
  使用路径可以做出很多很有意思的图形或者动画,
先从简单的开始,path.lineto()这个是用来画直线,如果不设置起点,则是默认从(0.0)为起点,可以使用path。moveto(x,y)来将起点移动到合适的位置。要绘制一个闭合的图形,可以使用paht.close()可以自动将最后一个点和最初的一个点进行连接构成封闭的图形。

###贝塞尔曲线
  要绘制贝塞尔曲线可以使用quadTo(float x1, float y1, float x2, float y2)前两个是控制点,后两个是终点。控制点就像一个磁铁,去吸引橡皮条上的另一个磁铁,橡皮条弯曲成一个曲线就类似控制点控制的贝塞尔曲线。
再来两张动图吧,这个的从爱歌Android自定义控件其实很简单专栏里面偷得,这篇博客也是看着他的博客总结的。

  • 一阶贝塞尔曲线
  • 二阶贝塞尔曲线
  • 三阶贝塞尔曲线
  • 四阶贝塞尔曲线
  • 五阶贝塞尔曲线

    看着就挺爽的。在Android中除了上面提到的quadTo(float x1, float y1, float x2, float y2)来绘制二阶贝塞尔曲线,还有cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)来实现三阶贝塞尔曲线。类似下面的
    我们使用贝塞尔曲线主要就是要去控制它的起点终点和控制点。之前看网上写过一个类似QQ气泡拖拽消失的例子,地址:我的GitHub原理比较简单,就是计算各个点的坐标比较复杂一些。