首页 > Android游戏开发基础part2--Canvas画布

Android游戏开发基础part2--Canvas画布

游戏开发基础part2--Canvas画布

又过了一周才继续做总结,四级结束了,应该可以多点时间学习游戏编程了。

Canvas画布类是一个在游戏当中担当非常重要的角色,它可以绘制出不同的图形和图片,可以说没有了画布就不能做出画面炫丽的游戏。

下面总结一下画布类Canvas封装的常用的函数:

具体说明如下:

1.drawColor(int color)

作用:绘制颜色覆盖画布,常用于刷屏

参数:颜色值,也可用十六进制形式表示(ARGB)

2.drawText(String text,float x,float y,Paint paint)

作用:绘制文本字符

第一个参数:文本内容

第二、三个参数:文本的X,Y坐标

第四个参数:画笔实例

3.drawPoint(float x,float y,Paint paint)

作用:绘制像素点

第一、二个参数:像素的坐标

第三个参数:画笔实例

4.drawPoints(float[] pts,Paint paint)

作用:绘制多个像素点

第一个参数:Float数组,数组中放置的是多个像素点的X,Y坐标

第二个参数:画笔实例

5.drawLine(float startX,float startY,float stopX,float stopY,Paint paint)

作用:绘制一条直线

前两个参数:起点的X,Y坐标

后两个参数:终点的X,Y坐标

最后一个参数:画笔实例

6.drawLines(float[] pts,Paint paint)

作用:绘制多条直线

第一个参数:Float数组,数组中放置的是多个直线的起始点与终点X,Y坐标

第二个参数:画笔实例

7.drawRact(Rect r,Paint paint)

作用:绘制矩形

第一个参数:矩形实例

第二个参数:画笔实例

8.drawRoundRect(RectF rect,float rx,float ry,Paint paint)

作用:绘制圆角矩形

第一个参数:矩形实例

第二个参数:圆角X轴的半径

第三个参数:圆角Y轴的半径

第四个参数:画笔实例

9.drawCircle(float cx,float cy,float radius,Paint paint)

作用:绘制圆形

第一、二个参数:圆形的中心点X,Y坐标

第三个参数:圆形的半径

第四个参数:画笔实例

10.drawArc(RectF oval,float startAngle,float sweepAngle,boolean useCenter,Paint paint)

作用:绘制弧形(扇形)

第一个参数:矩形实例

第二个参数:弧形的起始角度

第三个参数:弧形的终止角度

第四个参数:是否绘制中心点;如果为真,起始点与终止点都会分别连接中心点,从而形成封闭图形;如果为假,则起始点直接连到终止点,从而形成封闭图形。

第五个参数:画笔实例

11.drawOval(RectF oval,Paint paint)

作用:绘制椭圆

第一个参数:矩形实例

第二个参数:画笔实例

12.drawPath(Path path,Paint paint)

作用:绘制指定路径图形

第一个参数:路径实例

第二个参数:画笔实例

13.drawTextOnPath(String text,Path path,float hOffset,float vOffset,Paint paint)

作用:将文本沿着指定路径进行绘制

第一个参数:文本

第二个参数:路径实例

第三个参数:文本距离绘制起点的距离

第四个参数:文本距离路径的距离

第五个参数:画笔实例

 

创建项目实例:CanvasProject

项目运行效果图:

项目代码:

==>MySurfaceView.java

package com.cp;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;/*** * @author Himi**/
public class MySurfaceView extends SurfaceView implements Callback, Runnable {//用于控制SurfaceViewprivate SurfaceHolder sfh;//声明一个画笔private Paint paint;//声明一条线程private Thread th;//线程消亡的标识位private boolean flag;//声明一个画布private Canvas canvas;//声明屏幕的宽高private int screenW, screenH;//设置画布绘图无锯齿private PaintFlagsDrawFilter pfd = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);/*** SurfaceView初始化函数*/public MySurfaceView(Context context) {super(context);//实例SurfaceHoldersfh = this.getHolder();//为SurfaceView添加状态监听sfh.addCallback(this);//实例一个画笔paint = new Paint();//设置画笔颜色为白色paint.setColor(Color.WHITE);//设置焦点setFocusable(true);}/*** SurfaceView视图创建,响应此函数*/@Overridepublic void surfaceCreated(SurfaceHolder holder) {screenW = this.getWidth();screenH = this.getHeight();flag = true;//实例线程th = new Thread(this);//启动线程th.start();}/*** 游戏绘图*/
public void myDraw() {try {canvas = sfh.lockCanvas();if (canvas != null) {//----设置画布绘图无锯齿canvas.setDrawFilter(pfd);//----利用填充画布,刷屏canvas.drawColor(Color.BLACK);//----绘制文本canvas.drawText("drawText", 10, 10, paint);//----绘制像素点canvas.drawPoint(10, 20, paint);//----绘制多个像素点canvas.drawPoints(new float[] { 10, 30, 30, 30 }, paint);//----绘制直线canvas.drawLine(10, 40, 50, 40, paint);//----绘制多条直线canvas.drawLines(new float[] { 10, 50, 50, 50, 70, 50, 110, 50 }, paint);//----绘制矩形canvas.drawRect(10, 60, 40, 100, paint);//----绘制矩形2Rect rect = new Rect(10, 110, 60, 130);canvas.drawRect(rect, paint);canvas.drawRect(rect, paint);//----绘制圆角矩形RectF rectF = new RectF(10, 140, 60, 170);canvas.drawRoundRect(rectF, 20, 20, paint);//----绘制圆形canvas.drawCircle(20, 200, 20, paint);//----绘制弧形canvas.drawArc(new RectF(150, 20, 200, 70), 0, 230, true, paint);//----绘制椭圆canvas.drawOval(new RectF(150, 80, 180, 100), paint);//----绘制指定路径图形Path path = new Path();//设置路径起点path.moveTo(160, 150);//路线1path.lineTo(200, 150);//路线2path.lineTo(180, 200);//路径结束path.close();canvas.drawPath(path, paint);//----绘制指定路径图形Path pathCircle = new Path();//添加一个圆形的路径pathCircle.addCircle(130, 260, 20, Path.Direction.CCW);//----绘制带圆形的路径文本canvas.drawTextOnPath("PathText", pathCircle, 10, 20, paint);}} catch (Exception e) {// TODO: handle exception} finally {if (canvas != null)sfh.unlockCanvasAndPost(canvas);}
}/*** 触屏事件监听*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return true;}/*** 按键事件监听*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return super.onKeyDown(keyCode, event);}/*** 游戏逻辑*/private void logic() {}@Overridepublic void run() {while (flag) {long start = System.currentTimeMillis();myDraw();logic();long end = System.currentTimeMillis();try {if (end - start < 50) {Thread.sleep(50 - (end - start));}} catch (InterruptedException e) {e.printStackTrace();}}}/*** SurfaceView视图状态发生改变,响应此函数*/@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}/*** SurfaceView视图消亡时,响应此函数*/@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {flag = false;}
}



==>MainActivity.java

package com.cp;import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置全屏this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);//显示自定义的SurfaceView视图setContentView(new MySurfaceView(this));}
}



 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/wwj9413/archive/2012/06/18/2638571.html

更多相关:

  • 情况一:后台给的日期是Sat Jul 31 2021 21:50:01 GMT+0800 (中国标准时间),如果直接呈现给用户,他们一定会吐槽你不说人话~~~ 情况二:后台给的百分数是小数没有转化成00%格式 采用vue的过滤机制就可以解决这种情况,有两种方式: 第一种:全局写法,在main.js里面加入 // 【...

  • 问题描述 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。 例如:输入test.exe  -a 1 2       执行1+2输出3 问题分析 上面的逻辑思维很简单,但是问题在于如何在VS中向...

  • ------------------------siwuxie095                         MyBatis 中 #{} 和 ${} 的区别       1、在 MyBatis 的映射配置文件中,动态传递参数有两种方式:    (1)#{} 占位符    (2)${} 拼接符          2、#{} 和...

  •     #2.6 map()# 第一个参数传入一个函数,,第二个参数为一个可迭代对象li_1 = (1,3,5,7)def funcA(x): return x*xm1 = map(funcA,li_1)print(type(m1))print(m1())# 2.6 reduce()# 第一个参数传入一个函数,第二个参数 可以迭...

  • 列表,元组,字典的转换。 list列表是一组可变的元素集合 列表是'[]'括号组成的,[]括号包含所有元素,列表的创建可以传递字符串,也可以传递多个字符串来创建列表。如"asd", / "a","b" ... tuple元组的创建和列表一致,区别在于 元组是以'()'创建的,并且元组数据不可变。 dict字典不同于列表和元组,他...

  • 我们经常想要绘制各种形状,为此,OpenCV提供了一系列功能,可以绘制直线,矩形,圆等。OpenCV的绘图功能适用于图像,但其中大多数仅影响前三个通道,在单通道图像的情况下仅默认第一个通道。大多数绘图支持颜色,厚度,线条类型的修改。当指定颜色时,使用Scalar对象,大部分只使用前三个值。有时可以使用Scalar中的第四个值来表示al...

  • 学习如何在AutoCad中绘制建筑设计图从平面图到AutoCad土木工程中的整栋建筑 你会学到: 如何绘制房屋地图 如何绘制建筑设计 如何从AutoCad打印或出图 AutoCaD使用 AutoCaD命令使用 如何在2D Autocad中构建家庭或房屋地图(完整教程视频包括家庭地图、窗户、门、室内家具或物品、绘画等。) 能够担...

  • Quartz2D是跨平台的,同时支持iOS与Mac。 支持圆型裁剪,可以实现圆形头像等功能,也支持手势解锁、折线图等的制作。 对于复杂的UI界面,还可以通过Quartz2D将控件内部的结构画出来,可用于自定义控件。 实际上iOS大部分控件都是通过Quartz2D画出来的,一个重要价值是自定义view。 一些基础概念: 1.图形上下...