Android之View和SurfaceView
Android游戏当中主要的除了控制类外就是显示类View。SurfaceView是从View基类中派生出来的显示类。android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。
View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。
SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。
GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。
在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。 View和SurfaceView区别:
View:必须在UI的主线程中更新画面,用于被动更新画面。
surfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更新画面。
UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步,涉及到线程同步。
所以基于以上,根据游戏特点,一般分成两类。
1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
下面是使用sufaceView一个基本的框架:
import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; public class TestSurfaceView extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new MyView(this)); } class MyView extends SurfaceView implements SurfaceHolder.Callback,Runnable{ SurfaceHolder holder=null; Paint paint; public MyView(Context context) { super(context); // TODO Auto-generated constructor stub holder=getHolder(); holder.addCallback(this); paint=new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); this.setFocusable(true); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub Thread t=new Thread(this); t.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub isRunning=false; } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas=holder.lockCanvas(); //刷屏 canvas.drawColor(Color.BLACK); canvas.drawCircle(x, y, 10, paint); holder.unlockCanvasAndPost(canvas); } private void paint(Paint paint) { Canvas canvas=holder.lockCanvas(); //刷屏 canvas.drawColor(Color.BLACK); canvas.drawCircle(x, y, 10, paint); holder.unlockCanvasAndPost(canvas); } boolean isRunning=true; @Override public void run() { // TODO Auto-generated method stub while (isRunning) { // onDraw(null); paint(paint); move(); try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private int x,y; private void move(){ x+=2; y+=2; } } }
--------------------------------------------------------------------
PS: 欢迎关注公众号"Devin说",会不定期更新Java相关技术知识。
--------------------------------------------------------------------
Android之View和SurfaceView相关推荐
- Android显示系统之View与SurfaceView更新屏幕的区别
/******************************************************************************************** * auth ...
- 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)...
1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目"GameSurfaceView",首先自定义一个类&quo ...
- Android View与SurfaceView的手绘板制作
最近学习了如何使用View与SurfaceView制作简单的手绘板,在此做个小结. 自定义VIew实现手绘板: 首先是使用View来实现手绘板: package com.app.superxlcr.m ...
- android缓冲机制,Android自定义View之双缓冲机制和SurfaceView
Android自定义View系列 双缓冲机制 问题的由来 CPU访问内存的速度要远远快于访问屏幕的速度.如果需要绘制大量复杂的图像时,每次都一个个从内存中读取图形然后绘制到屏幕就会造成多次地访问屏幕, ...
- Android实时取景:用SurfaceView实现
对于基于摄像头的Android应用,实时取景是一个基本前提,通过前置或后置摄像头持续获取捕获到的内容,可以进一步做处理(人脸检测.美颜.滤镜等). 所谓实时取景,简单说就是调用android的摄像头, ...
- 一篇文章带你走近Android自定义view
系列文章目录 一篇文章带你走近Android自定义view 文章目录 系列文章目录 前言 一.为什么要自定义view 二.先看看一个超级简单的自定义view(三个构造函数) 三.了解手机的坐标系 四. ...
- android 循环弹幕,Android自定义View实现弹幕效果
原标题:Android自定义View实现弹幕效果 在很多视频直播中都有弹幕功能,而安卓上没有简单好用的弹幕控件,本文介绍一个自定义弹幕view的demo. 效果图: 思路: 自定义Textitem类表 ...
- Android自定义View(二)
文章目录 1.构造函数 2.onMeasure() 2.1.MeasureSpec 3.onSizeChanged() 4.onLayout() 5.onDraw() 上一篇: Android自定义V ...
- Android游戏开发:SurfaceView多点触控之完美钢琴游戏Demo
一.我们在使用SurfaceView开发小游戏时,如果需要在窗体上自绘按钮和可交互对象,这时需要监听屏幕的多点触控,并且每次触控的改变都需要和游戏产生交互,如何实现呢? CSDN博客 @MXout 有 ...
最新文章
- Android onAttach 的使用
- ENC28j60以太网芯片驱动程序简介
- com/alipay/config/AlipayConfig.java:[1,1] 非法字符: '\ufeff'
- Releases 31 Authoritative Schedule,等10月29日发布了~~~
- 004_Maven构建生命周期
- 一套图 搞懂“时间复杂度”(转载)
- 完善ext.grid.panel中的查询功能(紧接上一篇)
- 额!Java中用户线程和守护线程区别这么大?
- #C++初学记录(算法测试2019/5/5)(深度搜索)
- 阿里开源自研语音识别模型DFSMN 准确率高达96.04%
- c语言 有关文件读/写函数 详解
- Vue3 Composition API教程
- 计算机电子表操作格试题,计算机电子表格试题含答案Excel
- git 终端配置mac(udacity)
- 猿人时代java_猿人时代攻略
- CyanogenMode主题模块解析(中)
- 怎么投诉或举报京东第三方商家
- 2019CCPC女生专场赛_K - Tetris_打表/模拟_暴力之王
- 5s进水不开机怎么办 苹果5s进水后无法开机的维修方法
- PointNet++:Deep Hierarchical Feature Learning on Point Sets in a Metric Space