从Zero开始自定义View (一 )
view
android
参考:
http://developer.android.com/intl/zh-cn/reference/android/graphics/Canvas.html canvas官网文档
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文)
http://blog.csdn.net/rhljiayou/article/details/7212620 利用canvas画各种图形
http://blog.csdn.net/zhangweixing0/article/details/9064049 手机屏幕坐标
http://www.yourannet.com/android/android-screen-coordinates 手机屏幕坐标
主要是2D绘图
一 知识储备
1.1 什么是Canvas?
- 这个类相当于一个画布,你可以在里面画很多东西;
- 我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap)
- 它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
- 这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。
1.2 Canvas常用方法
- drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域
- drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象
- drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)//贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。
- drawLine(float startX, float startY, float stopX, float stopY, Paintpaint)//画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint 画刷对象。
- drawPoint(float x, float y, Paint paint) //画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。
- drawText(String text, float x, floaty, Paint paint)//渲染文本,Canvas类除了上面的还可以描绘文字,参数一是String类型的文本,参数二x轴,参数三y轴,参数四是Paint对象。
1.3 如何使用Canvas?
1.3.1 简介
既然有了一块画布,我们是不是需要画笔(提供了Paint类)才能在画布上面绘制图像呢?对,
我们可以来设置画笔的属性(颜色,粗细,各种特效),绘制出各种图案。
1.3.2 Paint类常用方法:
- setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
- setAlpha(int a) // 设置alpha不透明度,范围为0~255
- setAntiAlias(boolean aa) // 是否抗锯齿
- setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
- setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
- setTextSize(float textSize) // 设置字体大小
- setUnderlineText(booleanunderlineText) // 设置下划线
1.3.3 简单示例
在Android中一般是调用onDraw(Canvas canvas),传入canvas ,无需自己定义。
/**
*显示2个圆点
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint(); //创建画笔
paint.setColor(Color.BLUE); //设置蓝色
canvas.drawCircle(60, 20, 10, paint); //绘制
paint.setColor(Color.YELLOW); //改变颜色
canvas.drawCircle(120, 20, 20, paint); //绘制
}
内部调用JNI,参数如下
public void drawCircle(float cx, float cy, float radius, @NonNull Paint paint) {
native_drawCircle(mNativeCanvasWrapper, cx, cy, radius, paint.mNativePaint);
}
(当然还有一种方法,利用canvas绘制图像,生成bitmap,贴上view)
补充说明一下手机屏幕坐标系
左上角为坐标原点(0,0),横轴向右为正,纵轴向下为正。以像素为单位。