自定义控件学习笔记
#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原理比较简单,就是计算各个点的坐标比较复杂一些。