自定义控件分为两种一种是自定义ViewGroup控件,一种是自定义View控件;跟踪View的步伐其实能跟到Java实现的最下面我们能发现的也就只有Canvas了,再下去就是C++或C实现了;所以本文主要是站在设计的的角度讲解一下Canvas跟View的关系,再简单分析一下Canvas用法;
View作为Android中一切显示视图的父类,我们可看到它的绘制方法draw(Canvas canvas)中,无非也是通过Canvas的绘制来达到各种View的显示,如此Android中各种控件如:ImageView,TextView,EditTextView等都是通过Canvas根据传递的各个参数绘制不同的视图,从而形成各种不同的视觉控件;当然我们也可以通过继承View的onDraw方法,用Canvas绘制一些自定义图像,这就是最简单的自定义控件了,当然如果需要各种事件响应,就需深刻了解View的事件处理逻辑。
这里做个简单的比喻:如果把一个Android界面比喻成窗户,那么每一个View就是一块玻璃,整个框架就是ViewGroup了,而每一块玻璃上的图案就是我们说的Canvas,如果没有Canvas我们是什么都看不到的(只有透明的玻璃),而接收各种事件处理还是由玻璃(View)接收处理,通知刷新图案就是(Canvas)了,这就是简单的View与Canvas的关系。很明显,它们分工很明确,View只需要负责处理事件交互,而Canvas只负责根据View提供的参数来显示与刷新图像。当然如果你要多个View同时显示那就需要VIewGroup参与了。下面学习一下Canvas的基本用法:
Canvas基本用法分为两种:
1、直接在View的onDraw方法里面直接绘制;(这是有载体View(上面例子的玻璃)的情况下直接绘制图案,比如我们可以复写系统控件,根据需要再添加或修改我们需要的元素)
2、Canvas canvas = new Canvas(),这里仅仅是New的一个画布,我们是看不到的,它也无法处理任何事件,仅仅绘制修饰图像,至于显示与接收事件处理必须要有载体(View)才行;
Canvas有很多自己的绘制方法,但是最终都是调用底层代码实现:下面分类介绍一下Canvas常用方法:
1、save,saveLayer,restore方法保存与还原;
save(int saveFlags);可以指定还原哪些内容:
// the SAVE_FLAG constants must match their native equivalents /** restore the current matrix when restore() is called */ public static final int MATRIX_SAVE_FLAG = 0x01; /** restore the current clip when restore() is called */ public static final int CLIP_SAVE_FLAG = 0x02; /** the layer needs to per-pixel alpha */ public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04; /** the layer needs to 8-bits per color component */ public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08; /** clip against the layer's bounds */ public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10; /** restore everything when restore() is called */ public static final int ALL_SAVE_FLAG = 0x1F;saveLayer(RectF bounds, Paint paint, int saveFlags);Canvas利用此方法进行图层管理,可以根据区域保存当前图层,绘制完成之后利用restoreToCount将图层绑定;
2、draw方法;
drawColor,drawRGB,drawARGB,绘制颜色
drawPath,drawLines,drawOval等绘制几何图形;
drawBitmap,drawPictur绘制图片 ;
drawText绘制文字;
3、clipRegion,clipPath,clipRect裁剪,这里特别注意的有两种:
一是Region.Op中各种参数的含义;
二是Clip(剪切)的时机,是在canvas绘制之前完成对canvas的裁剪,而不是图像;
4、还有一些是与动画相关的Matrix操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种; 这里特意说明一下,这里Canvas进行matrix变化的时候相对坐标为(0,0);我们进行任何操作的时候,注意canvas.translate(scrollX, scrollY);canvas.translate(-scrollX, -scrollY);的意义。
Canvas具体用法这里不再阐述了,网上资料多多。。