Android学习之界面篇(九)SurfaceView简单学习

本文介绍了SurfaceView在Android开发中的应用,详细讲解了SurfaceView与View的区别,以及Surface和SurfaceView的关系。重点阐述了SurfaceHolder.Callback的作用,如何在主函数中设置回调并使用canvas进行图形绘制。此外,还提到了SurfaceView在游戏开发中的优势,并列举了Canvas的基本绘图操作和Paint类的相关设置方法。
摘要由CSDN通过智能技术生成
知识点:
  1. surfaceview介绍
  2. surfaceview与View的区别,surface与surfaceview的区别
  3. 实例创建与使用
  4. SurfaceHolder.Callback的使用,surfaceHolder可以看作是surfaceview的控制器,控制图形的大小,像素等.
  5. 在主函数中回调函数的使用getHolder.addCallback(this)
  6. canvas的锁定与解锁,绘制图形之前锁定画布,绘制结束之后解锁画布。
  7. canvas的save与restore, canvas画布的各种绘制操作
  8. Timer 的使用与操作

一、SurfaceView简介:
      在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制。又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输入得不到及时响应。
       SurfaceView是View类的继承类,这个View里内嵌了一个专门用于绘制的Surface,这个可以类似的理解成为一个在View里的Canvas。你可以控制这个Surface的格式和尺寸。Surfaceview类则控制这个Surface在屏幕上的正确位置。



android.view.SurfaceView

二、SurfaceView与view的区别:

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

  View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。

  SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。

   GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图; 是SurfaceView的子类,openGL专用。

在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。

   View:必须在UI的主线程中更新画面,用于被动更新画面。

  surfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更新画面。


     UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步,涉及到线程同步。
所以基于以上,根据游戏特点,一般分成两类。 

1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。 

2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。 

三、SurfaceView与Surface的联系

简单来说,SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。


两者联系如图所示:

四、下面是使用SurfaceView的简单实例:

public class MyView extends SurfaceView implements SurfaceHolder.Callback{

    //声明一个画笔
    private Paint paint=null;

    /**
     * 构造函数
     * @param context
     */
    public MyView(Context context) {
        super(context);
        //实例化画笔
        paint=new Paint();
        //给画笔设置颜色
        paint.setColor(Color.RED);
        getHolder().addCallback(this);//添加回调
    }

    /**
     * 自定义画图函数,此
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值