游戏开发基础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));}
}