当前位置: 首页 > 编程日记 > 正文

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

相关文章:

JavaScript有哪三部分组成?

在学习web前端技术时&#xff0c;最常见的也是需要最着重学习的就是JavaScript这一方面&#xff0c;工作中也是会经常用到的&#xff0c;那么JavaScript有哪三部分组成呢?来看看下面的详细介绍。 JavaScript有哪三部分组成? JavaScript的组成 JavaScript由ECMScript、BOM和DO…

【蓝桥杯】【入门题】【算法提高VIP】1480:模拟计算器

题目 1480&#xff1a;模拟计算器 蓝桥杯刷题群已成立&#xff0c;微信后台回复【蓝桥杯】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 使用Switch语句编写一个模拟简单计算器的程序。依次输入两个整数和一个字…

《c和指针》笔记5

递归 C通过运行时堆栈支持递归函数。的哦贵函数就是直接或间接调用自身的函数。 递归函数所需要的2个特性&#xff1a; 1、存在限制条件&#xff0c;当符合这个条件时递归便不再继续。 2、每次调用之后越来越接近这个限制条件。 递归函数在实现方面更加接近问题的抽象定义&…

怎么获得combobox的valueField值

var a; var dwField new Ext.form.ComboBox({ fieldLabel:管理员, mode: local, width:70, id:user_name, …

哪些人适合学习java技术

java技术在互联网行业一直都是非常重要的存在&#xff0c;学习java技术只会多不会少&#xff0c;那么目前哪些人适合学习java技术呢?来看看下面的详细介绍就知道了。 哪些人适合学习java技术? 1.在家待业人员&#xff0c;没有明确的目标&#xff0c;不知道自己想要什么&#…

AS3版本的MaxRects算法测试

早上&#xff0c;在微博发现一条信息&#xff0c;关于MaxRects算法的&#xff0c;杜增强DzQ 移植的关于AS3版本的MaxRects算法&#xff0c;具体地址是&#xff1a;http://www.duzengqiang.com/blog/post/971.html 代码如下&#xff1a; /* Based on the Public Domain MaxRecta…

android 52 粘滞广播

粘滞广播&#xff1a;广播发送出去以后&#xff0c;广播接收者还没有创建&#xff0c;当广播接收者注册的时候就可以接收&#xff0c;如果不是粘滞广播则如果没有广播接收者就以后不能再接收了。 mainActivity: package com.sxt.day07_07;import android.app.Activity; import …

【蓝桥杯】【入门题】【算法提高VIP】1481:剪刀石头布

题目 1481&#xff1a;剪刀石头布 蓝桥杯刷题群已成立&#xff0c;微信后台回复【蓝桥杯】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 编写程序实现“剪刀&#xff0c;石头&#xff0c;布”游戏。在这个游戏中…

UI设计培训学习中必须掌握的设计原则

不管是刚开始学习UI设计或者已经在学习UI设计同学中&#xff0c;UI设计的设计原则都是非常重要的&#xff0c;需要大家去重点关注的&#xff0c;下面小编就为大家详细的介绍一下UI设计培训学习中必须掌握的设计原则。 UI设计培训学习中必须掌握的设计原则&#xff1a; 重复 在平…

【复盘】如何培养小朋友的编程能力?

Scratch家长群已成立&#xff0c;微信后台回复【Scratch家长群】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 前几天&#xff0c;我在得到听了 邵慧宁的故事&#xff0c;就想着把游戏化的思维应用于培养自己孩子的编程能力上&#xff0c;并邀请志同道合的家长…

ubuntu系统下载编译android源码

在ubuntu系统下编译android需要注意的事项&#xff1a;1. 参考http://source.android.com/中的安装说明。2. 安装JDK6中碰到的问题可以参考http://hi.baidu.com/designhouse/item/0dbece7c4f6af0376e29f6c1中的说明&#xff0c;记得配置环境变量。3. 下载代码时如果出现timeout…

[windows server 2008 站点系列五]一招加速域用戶的文件查找速度

在企业IT基础环境中&#xff0c;文件服务器的应用越来越平凡&#xff0c;而文件服务器的数量也随之增多。作为IT应用人员习惯性的从管理者的角度出发&#xff0c;找寻DFS等帮助简化管理维护的解决方案。但是&#xff0c;另一方面&#xff0c;企业用户往往很难在为数众多的文件服…

在web.xml文件中配置Servlet时,主要配置哪些信息?

web前端的学习内容是比较多的&#xff0c;其中有一部分就是关于在web.xml文件中配置Servlet时的相关内容&#xff0c;在web.xml文件中配置Servlet时&#xff0c;主要配置哪些信息?来看看下面的详细介绍。 使用IDE开发Servlet时&#xff0c;配置信息可以通过可视化方式定义。然…

Oracle Study之--ORA-12537(TNS:connection closed) 错误案例

系统环境&#xff1a; 操作系统&#xff1a;RedHat EL55 Cluster&#xff1a; Oracle 11gR2 GRID Oracle&#xff1a; Oracle 11gR2 在构建Oracle 11gR2 RAC时出现以下错误&#xff1a; 1、建库时 2、Listener 日志信息 3、客户端连接错误信息 解决方案&#xff1a; 123456789…

MEF: MSDN 杂志上的文章(9) 控制部件创建策略 ???

http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx 默认情况下&#xff0c;容器中的所有部件实例都是单例&#xff0c;因而由在容器中导入它们的所有部件共享。因此&#xff0c;SalesOrderView 和 ViewFactory 的所有导入程序都将获得同一实例。在很多情况下需要这样&am…

【青少年编程】绘制等腰直角三角形

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 类比思维就是指把两个或者两类事物进行比较&#xff0c;并进行逻辑推理&#xff0c;找出两者之间的…

考PMP证书一定要参加PMP培训吗?

​ 考PMP证书一定要参加PMP培训吗?这是目前很多想要考pmp认证的小伙伴比较关心的一个问题&#xff0c;小编可以肯定的回答大家&#xff0c;当然需要参加&#xff0c;具体来看看下面的详细介绍。 考PMP证书一定要参加PMP培训吗?当然要&#xff0c;PMP考试要接受PMO授权许可培训…

Apache+PHP in MAC

是以为记&#xff0c;当前OSX下的ApachePHP配置。我的配置跟这篇文章应该一样&#xff1a;http://www.ccvita.com/398.htmlApache重启&#xff1a; apachectl restart|start|stopApache配置文件&#xff1a; /etc/apache2/httpd.conf (php5在这里开启&#xff09;Apache虚拟主机…

【青少年编程】绘制五角星

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 类比思维就是指把两个或者两类事物进行比较&#xff0c;并进行逻辑推理&#xff0c;找出两者之间的…

Kafka 消息监控 - Kafka Eagle

1.概述 在开发工作当中&#xff0c;消费 Kafka 集群中的消息时&#xff0c;数据的变动是我们所关心的&#xff0c;当业务并不复杂的前提下&#xff0c;我们可以使用 Kafka 提供的命令工具&#xff0c;配合 Zookeeper 客户端工具&#xff0c;可以很方便的完成我们的工作。随着业…

java开发培训好学习吗?难度大不大?

​ 互联网快速的发展&#xff0c;不断的在进行变革和更新&#xff0c;越来越多的人都对这个行业充满向往&#xff0c;很多人都想要学习java技术&#xff0c;那么java开发培训好学习吗?难度大不大?来看看下面的详细介绍。 java开发培训好学习吗?难度大不大?首先&#xff0c;…

gdb 调试动态库

原文链接 cat get.h int get (); int set (int a); cat get.c #include <stdio.h> #include "get.h" static int x0; int get () { printf ( "get x%d\n ", x); return x; } int set (int a) { printf …

【青少年编程】【一级】森林的一天

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。 如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取该程序的代码。 森林的一天 1. 准备工作 &#xff08;1&#xf…

Visual Studio Extensions for SharePoint v1.1

下载Visual Studio Extensions for SharePoint v1.1User Guide1、此版本&#xff08;1.1&#xff09;稍后会发布中文版2、此版本仍然只支持Visual Studio 20053、此版本仍然必须安装在包含了SharePoint Server&#xff08;或WSS&#xff09;、Visual Studio的机器上4、下个版本…

零基础学Java需要做哪些准备

想要成为一名合格的java工程师&#xff0c;那么好好学习java技术是非常重要的&#xff0c;对于零基础同学们来说&#xff0c;大家比较关注的就是“零基础学Java需要做哪些准备”这个问题&#xff0c;下面小编就来为大家做下详细的介绍。 零基础学Java需要做哪些准备? 1.制定学…

C# 启动外部程序的几种方法

C# 启动外部程序的几种方法&#xff1a; 1. 启动外部程序&#xff0c;不等待其退出。 2. 启动外部程序&#xff0c;等待其退出。 3. 启动外部程序&#xff0c;无限等待其退出。 4. 启动外部程序&#xff0c;通过事件监视其退出。 // using System.Diagnostics; private string…

在Mac和Linux之间用Rsync 拷贝文件

因为公司的苹果服务器是物理机&#xff0c;所以备份一直是个问题。Backup Exec 2012 勉强能工作&#xff0c;但是速度和可靠性一直都被我们所诟病。最后&#xff0c;老板决定把所有的数据copy到linux的共享文件夹&#xff0c;然后用Veeam 备份。 *IX系统里面说起拷贝&#xff0…

【复盘】升级打怪第一关,冲啊!

Scratch竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&#xff09;。 利用游…

在Java中是如何定义和声明接口的?

java技术需要学习的内容有很多&#xff0c;本期小编整理的教程资料就是关于“在Java中是如何定义和声明接口的?”的内容&#xff0c;希望下面的介绍能够给大家带来帮助。 如果一个抽象类的所有方法都是抽象的&#xff0c;则可以定义这个类为接口。接口是Java中最重要的概念之一…

Android--SQLite(一)

Android系统集成了一个轻量级的数据库&#xff1a;SQLite&#xff0c;SQLite是一个嵌入式的数据库引擎&#xff0c;专门适用于资源有限的设备上&#xff08;手机、PDA&#xff09;的适量数据存储。 Android提供了SQLiteDatabase&#xff0c;它代表了一个SQLite数据库&#xff0…