Android自定义控件_Canvas分析
2014-05-04 13:52
357 查看
自定义控件分为两种一种是自定义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);可以指定还原哪些内容:
源码:
View Code
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具体用法这里不再阐述了,网上资料多多。。
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;
View Code
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具体用法这里不再阐述了,网上资料多多。。
相关文章推荐
- android自定义控件画布canvas背景色失效变黑色
- Android自定义控件(二 .1)Canvas的操作
- Android控件架构与自定义控件详解(四)——事件拦截机制分析
- Android从零开搞系列:自定义View(3)Canvas基本API+综合应用+开源分析
- Android 自定义控件canvas- Layer图层
- Android 自定义控件-Canvas和Paint绘图详解-手把手带你绘制一个时钟.
- android 自定义控件Canvas用方法
- Android控件架构与自定义控件详解(四)事件拦截机制分析
- android自定义控件之extends某控件时,不同构造方法的调用情况分析。
- Android自定义控件绘制流程与Paint, Canvas相关API
- 工作日志记录:Android自定义控件中使用的canvas裁剪的相关参数记录:
- 滑动解锁 android Canvas自定义控件中硬件加速引起的canvas.clipPath问题
- Android4.2.2 Gallery2源码分析(5)——GLCanvasImpl.java
- chromium for android v34 2dCanvas硬件绘制实现分析
- android自定义控件(二)Canvas
- Android自定义控件前导基础知识学习(一)——Canvas
- Android4.2.2 Gallery2源码分析(4)——GLCanvas.java
- Android 自定义控件实现分析
- Android自定义控件前导基础知识学习(一)——Canvas
- chromium for android v34 2dcanvas硬件渲染实现分析