Canvas类和Paint的绘制机器人
来源:互联网 发布:java双引号转义字符 编辑:程序博客网 时间:2024/05/16 17:51
canvas.drawRoundRect(RectF, float, float, Paint) 方法用于画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
canvas.drawLine(startX, startY, stopX, stopY, paint):前四个参数的类型均为float,最后一个参数类型为Paint。表示用画笔paint从点(startX,startY)到点(stopX,stopY)画一条直线;
canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第一个参数oval为RectF类型,即圆弧显示区域,startAngle和sweepAngle均为float类型,分别表示圆弧起始角度和圆弧度数,3点钟方向为0度,useCenter设置是否显示圆心,boolean类型,paint为画笔;
canvas.drawCircle(float,float, float, Paint)方法用于画圆,前两个参数代表圆心坐标,第三个参数为圆半径,第四个参数是画笔;
清楚这些函数的用法之后,我们是否就噼里啪啦地敲代码了呢?别急,我们来搞个设计。既然这些函数都是用来画图的,也就是说它们有共性——画。所有我们应该设计一个接口interface,对于这次任务,只需要一个成员方法就足够了。对于每一个图形,是只用一个方法画,还是将画图封装成类呢?我建议是封装成类。因为说不定你明天就会嫌弃它不会动,想它动起来,或者你过两天又希望在机器人的每个部位加点什么。所以我将每一个图形封装成类,都实现一个名叫drawGraphics的接口。最后,要记得给UI创建一个线程哦。
就这样我开始动手做了,但是很快就发现问题了。什么问题?在定位的时候,也就是设置每个图形的显示区域时,我自以为这里的Rect跟Java的Rectangle是一样的,但我错了。原来这厮跟MFC中的RECT结构才是一家人,害我折腾了许久。
Rect(int left,int top,int right,int bottom)
left
矩形左上角X坐标值
top
矩形左上角Y坐标值
right
矩形右下角X坐标值
bottom
矩形右下角Y坐标值
下面借用一张图说明(忘了哪个博客找来的(*^__^*) 嘻嘻……),如Rect(150, 75, 260, 120) 一目了然吧。
接口类:
package com.hanfeng.graphicsdemo03;import android.graphics.Canvas;public interface DrawGraphics {public void draw(Canvas canvas);}
绘制圆角矩形类:
package com.hanfeng.graphicsdemo03;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;/** * 绘制矩形 * @author hanfeng * @data 2012-8-19 下午3:31:35 */public class DrawRect implements DrawGraphics {private Paint paint = null;public DrawRect(){paint = new Paint();}@Overridepublic void draw(Canvas canvas) {/*定义圆角矩形*/ RectF rectF1 = new RectF(120,170,370,500); RectF rectF2 = new RectF(40,150,90,400); RectF rectF3 = new RectF(390,150,440,400); RectF rectF4 = new RectF(140,520,200,650); RectF rectF5 = new RectF(290,520,350,650); /*消除画笔锯齿*/ paint.setAntiAlias(true); /*设置画笔颜色*/ paint.setColor(Color.GREEN); /*在画布上绘制圆角矩形*/ canvas.drawRoundRect(rectF1, 20, 20, paint); canvas.drawRoundRect(rectF2, 20, 20, paint); canvas.drawRoundRect(rectF3, 20, 20, paint); canvas.drawRoundRect(rectF4, 20, 20, paint); canvas.drawRoundRect(rectF5, 20, 20, paint); }}
绘制机器人脑袋类;
package com.hanfeng.graphicsdemo03;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;/** * 绘制圆形 * @author hanfeng * @data 2012-8-19 下午4:36:28 */public class DrawCircle implements DrawGraphics {/*机器人脑袋瓜*/private Paint paint = null;/*机器人眼睛*/private Paint paint_eye = null;public DrawCircle(){paint = new Paint();paint_eye = new Paint();}@Overridepublic void draw(Canvas canvas) {paint.setAntiAlias(true);paint_eye.setAntiAlias(true);paint.setColor(Color.GREEN);paint_eye.setColor(Color.WHITE);RectF rectF = new RectF(120,60,370,240);canvas.drawArc(rectF, 180, 180, false, paint);//绘制圆形(圆心x,圆心y,半径r,画笔p)canvas.drawCircle(190, 110, 18, paint_eye);canvas.drawCircle(300, 110, 18, paint_eye);}}
绘制机器人耳朵类:
package com.hanfeng.graphicsdemo03;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;/** * 绘制耳朵类 * @author hanfeng * @data 2012-8-19 下午4:37:02 */public class DrawLine implements DrawGraphics {private Paint paint = null;public DrawLine(){paint = new Paint();}@Overridepublic void draw(Canvas canvas) {paint.setAntiAlias(true);paint.setColor(Color.GREEN);paint.setStrokeWidth(2);canvas.drawLine(120,40,170,90, paint); canvas.drawLine(320,90,370,40, paint);}}
GameView类:
package com.hanfeng.graphicsdemo03;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.view.View;public class GameView extends View implements Runnable {//声明Oaint对象private Paint paint = null;private DrawGraphics drawGraphics = null;public GameView(Context context) {super(context);/*构建Paint对象*/paint = new Paint();/*开启线程*/new Thread(this).start();}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);/*设置画布颜色*/canvas.drawColor(Color.BLACK);/*设置笔刷无锯齿*/paint.setAntiAlias(true);/*设置图形为空心的*/paint.setStyle(Style.STROKE);/*开始绘制几何图形*/drawGraphics = new DrawRect();drawGraphics.draw(canvas);drawGraphics = new DrawCircle();drawGraphics.draw(canvas);drawGraphics = new DrawLine();drawGraphics.draw(canvas);}@Overridepublic void run() {// TODO Auto-generated method stubwhile (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(200);} catch (Exception e) {Thread.currentThread().isInterrupted();}//使用postInvalidate在线程中更新界面postInvalidate();}}}
最后在Acticity中设置显示
- Canvas类和Paint的绘制机器人
- canvas和paint 类 的学习
- 绘制基础知识-canvas paint
- Paint和canvas的用法
- Paint和canvas的用法
- Canvas和paint的使用
- android游戏开发中图形绘制:Canvas和Paint的使用
- Android:视图绘制(一) ------基本的绘图操作Paint和Canvas
- android 中的绘制类Paint 画笔,Canvas 画布,Bitmap 类和BitmapFactory及自定义属性
- 使用Canvas和Paint自己绘制一个折线图
- Android Canvas Paint绘制文本
- 安卓中Paint类和Canvas类的方法汇总
- Drawable、Bitmap、Canvas和Paint的区别
- Drawable、Bitmap、Canvas和Paint的关系
- andriod Canvas 和 Paint方法的解释
- Drawable、Bitmap、Canvas和Paint的区别
- Drawable、Bitmap、Canvas和Paint的关系
- Drawable、Bitmap、Canvas和Paint的关系
- 淘宝登陆
- C/C++浮点数在内存中是怎么存储的?
- VC++程序运行时出现Runtime error的一种情况及解决
- HDU 4370 0 or 1
- 持久化订单生成
- Canvas类和Paint的绘制机器人
- Oracle SQL语句调优(一)
- 今儿先给开个头儿
- 悟透JavaScript之原型扩展 ---(1)
- 突破应用的边界——以人为中心的信息系统
- 悟透JavaScript之原型扩展 ---(2)
- 查找两个已经排好序的数组的第k大的元素
- 单链表的逆置-C++实现
- photoshop分割保存精灵表图片