zoukankan      html  css  js  c++  java
  • Android攻城狮SurfaceView

    SurfaceView:

       它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到     SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

    2、实现

        首先继承SurfaceView并实现SurfaceHolder.Callback接口
    使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容
                          可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。

    需要重写的方法

     (1)public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}

         //在surface的大小发生改变时激发

     (2)public void surfaceCreated(SurfaceHolder holder){}

         //在创建时激发,一般在这里调用画图的线程。

     (3)public void surfaceDestroyed(SurfaceHolder holder) {}

         //销毁时激发,一般在这里将画图的线程停止、释放。

    整个过程:继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。


    3、SurfaceHolder
    这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
    几个需要注意的方法:
    (1)、abstract void addCallback(SurfaceHolder.Callback callback);
    // 给SurfaceView当前的持有者一个回调对象。
    (2)、abstract Canvas lockCanvas();
    // 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
    (3)、abstract Canvas lockCanvas(Rect dirty);
    // 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
    // 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
    (4)、abstract void unlockCanvasAndPost(Canvas canvas);
    // 结束锁定画图,并提交改变。

     1 //AndroidSurfaceView绘制组合图形1实现移动
     2 public class MainActivity extends ActionBarActivity {
     3 
     4     @Override
     5     protected void onCreate(Bundle savedInstanceState) {
     6         super.onCreate(savedInstanceState);
     7         setContentView(new GameView(this));
     8 
     9         
    10     }
    11 
    12     
    13 }

     

     1 public class GameView extends SurfaceView implements Callback {
     2     private Contanier contanier;
     3     private Rect rect;
     4     private Circle circle;
     5 
     6     public GameView(Context context) {
     7         super(context);
     8         contanier = new Contanier();
     9         rect = new Rect();
    10         circle = new Circle();
    11         rect.addChildrenView(circle);
    12         contanier.addChildrenView(rect);
    13         getHolder().addCallback(this);
    14     }
    15 
    16     public void draw() {
    17         Canvas canvas = getHolder().lockCanvas();
    18         canvas.drawColor(Color.WHITE);
    19         contanier.draw(canvas);
    20 
    21         getHolder().unlockCanvasAndPost(canvas);
    22 
    23     }
    24 
    25     private Timer timer = null;
    26     private TimerTask task = null;
    27 
    28     public void startTimer() {
    29         timer = new Timer();
    30         task = new TimerTask() {
    31 
    32             @Override
    33             public void run() {
    34                 // TODO Auto-generated method stub
    35                 draw();
    36             }
    37         };
    38         timer.schedule(task, 100, 100);
    39     }
    40 
    41     public void stopTimer() {
    42         if (timer != null) {
    43             timer.cancel();
    44             timer = null;
    45         }
    46     }
    47 
    48     @Override
    49     public void surfaceCreated(SurfaceHolder holder) {
    50         // TODO Auto-generated method stub
    51         startTimer();
    52     }
    53 
    54     @Override
    55     public void surfaceChanged(SurfaceHolder holder, int format, int width,
    56             int height) {
    57         // TODO Auto-generated method stub
    58 
    59     }
    60 
    61     @Override
    62     public void surfaceDestroyed(SurfaceHolder holder) {
    63         // TODO Auto-generated method stub
    64         stopTimer();
    65     }
    66 
    67 }

     

     1 public class Contanier {
     2     private List<Contanier> children = null;
     3     private float x = 0, y = 0;
     4 
     5     public Contanier() {
     6         // TODO Auto-generated constructor stub
     7         children = new ArrayList<Contanier>();
     8     }
     9 
    10     public void draw(Canvas canvas) {
    11         canvas.save();
    12         canvas.translate(getX(), getY());
    13         childrenView(canvas);
    14         for (Contanier c : children) {
    15             c.draw(canvas);
    16 
    17         }
    18         canvas.restore();
    19     }
    20 
    21     public void childrenView(Canvas canvas) {
    22 
    23     }
    24 
    25     public void addChildrenView(Contanier child) {
    26         children.add(child);
    27     }
    28 
    29     public void removeChildrenView(Contanier child) {
    30         children.remove(child);
    31     }
    32 
    33     public float getX() {
    34         return x;
    35     }
    36 
    37     public void setX(float x) {
    38         this.x = x;
    39     }
    40 
    41     public float getY() {
    42         return y;
    43     }
    44 
    45     public void setY(float y) {
    46         this.y = y;
    47     }
    48 
    49 }
     1 public class Rect extends Contanier {
     2     private Paint paint = null;
     3 
     4     public Rect() {
     5         // TODO Auto-generated constructor stub
     6         paint = new Paint();
     7         paint.setColor(Color.GREEN);
     8     }
     9 
    10     @Override
    11     public void childrenView(Canvas canvas) {
    12         // TODO Auto-generated method stub
    13         super.childrenView(canvas);
    14         canvas.drawRect(0, 0, 100, 100, paint);
    15         this.setY(this.getY()+1);
    16     }
    17 }
     1 public class Circle extends Contanier {
     2     private Paint paint = null;
     3 
     4     public Circle() {
     5         // TODO Auto-generated constructor stub
     6         paint = new Paint();
     7         paint.setColor(Color.BLUE);
     8 
     9     }
    10 
    11     @Override
    12     public void childrenView(Canvas canvas) {
    13         // TODO Auto-generated method stub
    14         super.childrenView(canvas);
    15         canvas.drawCircle(50, 50, 50, paint);
    16     }
    17 }

  • 相关阅读:
    BZOJ 2034 【2009国家集训队】 最大收益
    vijos P1780 【NOIP2012】 开车旅行
    BZOJ 2115 【WC2011】 Xor
    BZOJ 3631 【JLOI2014】 松鼠的新家
    BZOJ 4717 改装
    BZOJ 2957 楼房重建
    BZOJ 4034 【HAOI2015】 T2
    BZOJ 1834 【ZJOI2010】 network 网络扩容
    BZOJ 2440 【中山市选2011】 完全平方数
    BZOJ 2733 【HNOI2012】 永无乡
  • 原文地址:https://www.cnblogs.com/my334420/p/6899832.html
Copyright © 2011-2022 走看看