当前位置:操作系统 > 安卓/Android >>

【Android游戏开发之三】剖析 Su易做图ceView ! Callback以及Su易做图ceHolder!!

 

各位童鞋请你们注意:su易做图ceview中确实有onDraw这个方法,但是你su易做图ceview不会自己去调用!!!

    而我代码中的ondraw() 也好draw() 也好,都是我自己定义的一个方法。。。放在线程中不断调用的,一定要注意!!

    之前我们对view和su易做图ceview 做了比较和取舍,最后我们发现su易做图ceview更加的适合运作与游戏开发中,那么下面就让我们来看看这个su易做图ceview的结构吧;

先上一段代码:

/**  

 *   

 */   

package com.himi;   

import android.content.Context;   

import android.graphics.Canvas;   

import android.graphics.Color;   

import android.graphics.Paint;   

import android.view.Su易做图ceHolder;   

import android.view.Su易做图ceView;   

import android.view.Su易做图ceHolder.Callback;   

import android.view.animation.Animation;   

/**  

 * @author Himi  

 */   

public class MySu易做图ceView extends Su易做图ceView implements Callback, Runnable {// 备注1   

    private Su易做图ceHolder sfh;   

    private Thread th;   

    private Canvas canvas;   

    private Paint paint;   

    private int ScreenW, ScreenH;   

    public MySu易做图ceView(Context context) {   

        super(context);   

        th = new Thread(this);   

        sfh = this.getHolder();   

        sfh.addCallback(this); // 备注1   

        paint = new Paint();   

        paint.setAntiAlias(true);   

        paint.setColor(Color.RED);   

        this.setKeepScreenOn(true);// 保持屏幕常亮   

    }   

    @Override   

    public void startAnimation(Animation animation) {   

        super.startAnimation(animation);   

    }   

    public void su易做图ceCreated(Su易做图ceHolder holder) {   

        ScreenW = this.getWidth();// 备注2   

        ScreenH = this.getHeight();   

        th.start();   

    }   

    private void draw() {   

        try {   

            canvas = sfh.lockCanvas(); // 得到一个canvas实例    

            canvas.drawColor(Color.WHITE);// 刷屏   

            canvas.drawText("Himi", 100, 100, paint);// 画文字文本   

            canvas.drawText("这就是简单的一个游戏框架", 100, 130, paint);   

        } catch (Exception ex) {   

        } finally { // 备注3   

            if (canvas != null)   

                sfh.unlockCanvasAndPost(canvas);  // 将画好的画布提交   

        }   

    }    

    public void run() {   

        while (true) {   

            draw();   

            try {   

                Thread.sleep(100);   

            } catch (InterruptedException e) {   

                // TODO Auto-generated catch block   

                e.printStackTrace();   

            }   

        }   

    }   

    public void su易做图ceChanged(Su易做图ceHolder holder, int format, int width,   

            int height) {   

    }   

    public void su易做图ceDestroyed(Su易做图ceHolder holder) {   

        // TODO Auto-generated method stub   

    }   

}  

代码很简单,我们继承继承su易做图ceview类,并且使用回调callback接口以及线程runnable接口。那么这里我简单的说下Callback接口和Su易做图ceHolder 类的作用;

//备注1

callback接口:

    只要继承Su易做图ceView类并实现Su易做图ceHolder.Callback接口就可以实现一个自定义的Su易做图ceView了,Su易做图ceHolder.Callback在底层的Su易做图ce状态发生变化的时候通知View,Su易做图ceHolder.Callback具有如下的接口:

    •su易做图ceCreated(Su易做图ceHolder holder):当Su易做图ce第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Su易做图ce。

     •su易做图ceChanged(Su易做图ceHolder holder, int format, int width,int height):当Su易做图ce的状态(大小和格式)发生变化的时候会调用该函数,在su易做图ceCreated调用后该函数至少会被调用一次。

 Su易做图ceHolder 类:

    它是一个用于控制su易做图ce的接口,它提供了控制su易做图ce 的大小,格式,上面的像素,即监视其改变的。

    Su易做图ceView的getHolder()函数可以获取Su易做图ceHolder对象,Su易做图ce 就在Su易做图ceHolder对象内。虽然Su易做图ce保存了当前窗口的像素数据,但是在使用过程中是不直接和Su易做图ce打交道的,由Su易做图ceHolder的Canvas lockCanvas()或则Canvas lockCanvas()函数来获取Canvas对象,通过在Canvas上绘制内容来修改Su易做图ce中的数据。如果Su易做图ce不可编辑或则尚未创建调用该函数会返回null,在unlockCanvas() 和lockCanvas()中Su易做图ce的内容是不缓存的,所以需要完全重绘Su易做图ce的内容,为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect rect)函数来指定一个rect区域,这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后,Su易做图ceView会获取Su易做图ce的一个同步锁直到调用unlockCanvasAnd

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,