Canvas类和Paint的绘制机器人

   canvas.drawRect(RectF,Paint)方法用于画矩形,第一个参数为图形显示区域,第二个参数为画笔,设置好图形显示区域Rect和画笔Paint后,即可画图;


    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();
	}
	@Override
	public 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();
	}

	@Override
	public 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();
	}

	@Override
	public 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();
	}
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.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);
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (!Thread.currentThread().isInterrupted()) {
			try {
				Thread.sleep(200);
			} catch (Exception e) {
				Thread.currentThread().isInterrupted();
			}
			//使用postInvalidate在线程中更新界面
			postInvalidate();
		}
	}

}

最后在Acticity中设置显示



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值