这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制。这里要1个简单的layout资源和2个java类:在MainActivity中主要和以往一样,唯一不同的是去除电池图标和标题等操作,然后第10行设置显示的VIEW.

 public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//隐去标题栏(应用程序的名字)
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
//隐去状态栏部分(电池等图标和一切修饰部分)
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置显示View实例
setContentView(new MyView(this));
}
}

在MyView中主要是集成View,里面有构造函数、onDraw、onKeyDown、onKeyUp、onTouchEvent等,其中最主要的就是canvas的应用,这里可以吧canvas看做是一张白纸,你可以在上面按照你的意图进行绘制。

 public class MyView extends View {
private int textX = 20, textY = 20; /**
* 重写父类构造函数
* @param context
*/
public MyView(Context context) {
super(context);
setFocusable(true);
// setFocusableInTouchMode(true);
} /**
* 重写父类绘图函数
*/
@Override
protected void onDraw(Canvas canvas) {
//创建一个画笔的实例
Paint paint = new Paint();
//设置画笔的颜色
paint.setColor(Color.WHITE);
//绘制文本
canvas.drawText("Game", textX, textY, paint);
super.onDraw(canvas);
} /**
* 重写按键按下事件函数
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//判定用户按下的键值是否为方向键的“上下左右”键
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
//“上”按键被点击,应该让文本的Y坐标变小
textY -= 2;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
//“下”按键被点击,应该让文本的Y坐标变大
textY += 2;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
//“左”按键被点击,应该让文本的X坐标变小
textX -= 2;
} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
//“右”按键被点击,应该让文本的X坐标变大
textX += 2;
}
//重绘画布
invalidate();
//postInvalidate();
return super.onKeyDown(keyCode, event);
} /**
* 重写按键抬起事件函数
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
return super.onKeyUp(keyCode, event);
} // /**
// * 重写触屏事件函数
// */
// @Override
// public boolean onTouchEvent(MotionEvent event) {
// int x = (int)event.getX();
// int y = (int)event.getY();
// //玩家手指点击屏幕的动作
// if (event.getAction() == MotionEvent.ACTION_DOWN) {
// textX = x;
// textY = y;
// //玩家手指抬起离开屏幕的动作
// } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
// textX = x;
// textY = y;
// //玩家手指在屏幕上移动的动作
// } else if (event.getAction() == MotionEvent.ACTION_UP) {
// textX = x;
// textY = y;
// }
// //重绘画布
// invalidate();
// //postInvalidate();
// return true;
// }
@Override
public boolean onTouchEvent(MotionEvent event) {
//获取用户手指触屏的X坐标赋值与文本的X坐标
textX = (int)event.getX();
//获取用户手指触屏的Y坐标赋值与文本的Y坐标
textY = (int)event.getY();
//重绘画布
invalidate();
//postInvalidate();
return true;
}
}

surfaceView框架和View框架类似,仍然需要一个MainActivity做相应的设置,然后剩下的任务就交给SurfaceView了:MySurfaceView为构造函数,surfaceCreated视图创建响应该函数,onTouch和onKey都是类似的用户操作响应函数,最重要的是run函数,该函数是线程的run函数,该函数将一直执行不断处理屏幕绘制和逻辑变化,来实现动画与交互的效果。

 public class MySurfaceView extends SurfaceView implements Callback, Runnable {
//用于控制SurfaceView
private SurfaceHolder sfh;
//声明一个画笔
private Paint paint;
//文本的坐标
private int textX = 10, textY = 10;
//声明一条线程
private Thread th;
//线程消亡的标识位
private boolean flag;
//声明一个画布
private Canvas canvas;
//声明屏幕的宽高
private int screenW, screenH;
/**
* SurfaceView初始化函数
*/
public MySurfaceView(Context context) {
super(context);
//实例SurfaceHolder
sfh = this.getHolder();
//为SurfaceView添加状态监听
sfh.addCallback(this);
//实例一个画笔
paint = new Paint();
//设置画笔颜色为白色
paint.setColor(Color.WHITE);
//设置焦点
setFocusable(true);
}
/**
* SurfaceView视图创建,响应此函数
*/
@Override
public 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.drawRect(0,0,this.getWidth(),
//this.getHeight(), paint);
//-----------利用填充画布,刷屏
// canvas.drawColor(Color.BLACK);
//-----------利用填充画布指定的颜色分量,刷屏
canvas.drawRGB(0, 0, 0);
canvas.drawText("Game", textX, textY, paint);
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
/**
* 触屏事件监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
textX = (int) event.getX();
textY = (int) event.getY();
return true;
}
/**
* 按键事件监听
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
/**
* 游戏逻辑
*/
private void logic() {
}
@Override
public 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视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}
}

本文链接:http://www.cnblogs.com/zjutlitao/p/4230252.html

更多精彩:http://www.cnblogs.com/zjutlitao/p/

[安卓] 8、VIEW和SURFACEVIEW游戏框架的更多相关文章

  1. 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)

    1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfac ...

  2. 【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)

    对于玩家来说,游戏是动态的:对于游戏开发人员来说,游戏是静态的,只是不停地播放不通的画面,让玩家看到了动态的效果. 进入Android之前,首先要熟悉三个重要的类:View(视图).Canvas(画布 ...

  3. [Android游戏开发学习笔记]View和SurfaceView

    本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...

  4. JustWeEngine - 轻量级游戏框架

    JustWeEngine - 轻量级游戏框架 An easy open source Android game engine. Github地址 引擎核心类流程图 使用方法 引入Engine作为Lib ...

  5. Android之View和SurfaceView

    Android之View和SurfaceView Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三 ...

  6. Android进阶笔记05:View、SurfaceView 和GLSurfaceView 的关系和区别

    1.  Android游戏当中主要的除了控制类外就是显示类View.SurfaceView是从View基类中派生出来的显示类.android游戏开发中常用的三种视图是:    (1) view.Sur ...

  7. [android游戏开发初学]简单的游戏框架

    这两天,没事想学习游戏开发,看了一些资料之后准备开始.为了将来编码方便,先写了一个简单的游戏框架方便自己以后做练习用. 如果以后没有什么特殊的需求--比如opengl什么的,会尽量用这个简单框架来实现 ...

  8. Android 画图类View与SurfaceView之学习

    在开发游戏开发中,android相应的提供了几个重要的模块: 1.显示界面的视图:  Android 提供 View 和 SurfaceView 2.控制游戏整体结构: android 提供 Acti ...

  9. 基于cocos2d-x的游戏框架设计——李成

    视频:http://v.youku.com/v_show/id_XMzc5ODUyMTI4.html?f=17330006 网易科技讯 3月31日,第四届CocoaChina开发者大会暨Cocos2d ...

随机推荐

  1. kindeditor编辑器的使用

    KindEditor是一款用Javascript编写的开源在线HTML编辑器,主要用户是让用户在网站上获得可见即可得的编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框(texta ...

  2. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  3. 编程:什么是REST

    REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 ...

  4. 解决:HttpClient导致应用出现过多Close_Wait的问题

    最近发现一个问题,在服务器上通过netstat命令发现有大量的Close_Wait长时间存在,甚至有时候数量接近1000: 查看服务器参数(etc/sysctl.conf): net.ipv4.tcp ...

  5. EF联合查询的新用法

    用EF很多年了,做联合查询时,只知道linq和lambda两种语法,今天朋友发了一个链接,打开看后发现是EF内置的新的关于联合查询的方法,赶紧抄录下来,以备后用. 现在先把这几种方法,各写一个例子,便 ...

  6. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. cell线条前后缩短

    [cell setSeparatorInset:UIEdgeInsetsMake(0, 20, 0, 20)];

  8. Bridging signals hdu 1950 (最长上升子序列)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=1950 题意:求最长上升(不连续or连续)子序列 推荐博客链接: http://blog.csdn.n ...

  9. good excel website

    http://www.codematic.net/excel-tools/free-excel-tools.htm

  10. Hessian 初探

    Hessian 是一个序列化协议, 他的优点在于比 Java 原生的对象序列化/反序列化速度更快, 序列化出来以后的数据更小. 序列化协议跟应用层协议无关, 可以将 Hessian 序列化以后的数据放 ...