surfaceView
来源:互联网 发布:mac版百度云好用吗 编辑:程序博客网 时间:2024/06/01 09:22
Android SurfaceView简介 surfaceView和View最本质的区别在于:
surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中 thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。
所以基于以上,根据游戏特点,一般分成两类。
1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
nba当前离线
No.3 砌墙工人- import android.content.Context;
- import android.graphics.Canvas;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class MySurfaceView extends SurfaceView implements SurfaceHolder. Callback {
- private SurfaceHolder holder;
- private MySurfaceViewThread mySurfaceViewThread;
- private boolean hasSurface;
- MySurfaceView(Context context) {
- super(context);
- init();
- }
- private void init() {
- //创建一个新的SurfaceHolder, 并分配这个类作为它的回调(callback)
- holder = getHolder();
- holder.addCallback(this);
- hasSurface = false;
- }
- public void resume() {
- //创建和启动图像更新线程
- if (mySurfaceViewThread == null) {
- mySurfaceViewThread = new MySurfaceViewThread();
- if (hasSurface == true) mySurfaceViewThread.start();
- }
- }
- public void pause() {
- // 杀死图像更新线程
- if (mySurfaceViewThread != null) {
- mySurfaceViewThread.requestExitAndWait();
- mySurfaceViewThread = null;
- }
- }
- public void surfaceCreated(SurfaceHolder holder) {
- hasSurface = true;
- if (mySurfaceViewThread != null) mySurfaceViewThread.start();
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- hasSurface = false; pause();
- }
- public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) {
- if (mySurfaceViewThread != null) mySurfaceViewThread.onWindowResize(w, h);
- }
- class MySurfaceViewThread extends Thread {
- private boolean done;
- MySurfaceViewThread() {
- super();
- done = false;
- }
- @Override
- public void run() {
- SurfaceHolder surfaceHolder = holder;
- // 重复绘图循环,直到线程停止
- while (!done) {
- // 锁定surface,并返回到要绘图的Canvas
- Canvas canvas = surfaceHolder.lockCanvas();
- // 待实现:在Canvas上绘图
- // 解锁Canvas,并渲染当前图像
- surfaceHolder.unlockCanvasAndPost(canvas);
- }
- }
- public void requestExitAndWait() {
- // 把这个线程标记为完成,并合并到主程序线程
- done = true;
- try {
- join();
- } catch (InterruptedException ex) {
- }
- }
- public void onWindowResize(int w, int h) {
- // 处理可用的屏幕尺寸的改变
- }
- }
- }
3. 使用SurfaceView创建3D控件
Android完全支持OpenGL ES 3D渲染框架,其中包含了对设备的硬件加速的支持。SurfaceView控件提供了一个表面,可以在它上面渲染你的OpenGL场景。
OpenGL通常在桌面应用程序中使用,可以提供动态3D交互和动画。资源受限的设备不具备多边形处理的能力,只有那些拥有专门的3D图形处理程序的桌面PC和游戏设备才具有这些功能。在应用程序中,需要考虑到3D SurfaceView的负载都将放置在处理程序上,而且还要尝试让显示的多边形的数目和它们更新的速率尽可能地低。
0 0
- surfaceview
- SurfaceView
- surfaceview
- surfaceview
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- surfaceview
- SurfaceView
- SurfaceView
- SurfaceView
- surfaceview
- surfaceview
- SurfaceView
- 10008---SpringMVC 使用 Servlet API 作为入参
- String StringBuilder StringBuffer 对比 总结得非常好
- [每日一答] [20151019] R语言中的正则表达式
- [每日一答] [20151020] 中文乱码,修改文件编码的方法
- android 仿朋友圈下拉刷新效果
- surfaceView
- JAVA初识
- [每日一答] [20151021] R如何制作多维度散点图
- 10009---SpringMVC 处理模型数据
- onServiceDisconnected()什么时候被调用
- Codeforces Round #326 (Div. 2) 588ABC题解
- Solve It(二分解方程)
- 使用HttpClient发送POST请求
- Xcode6中如何去掉默认的Main.storyboard